NUMPY (python) 和 ARMADILLO (c++) 给出不同的结果

问题描述

我有一个双矩阵:

 M =[ [1.0000e+00,-6.5919e-17,2.8284e-01],[          0,1.0000e+00,2.8284e-01,-7.6328e-17],0],[-6.5919e-17,[ 2.8284e-01,-7.6328e-17,1.0000e+00]]

当我用 arma::eig_sym()g++ -std=c++17 test.cpp -larmadillo 对其进行对角化时,我得到的特征向量为:

Arma EigVec : 
   5.0000e-01  -1.9854e-32   5.0000e-01  -5.3490e-01   4.6247e-01   1.9854e-32
  -5.0000e-01  -7.3570e-17   5.0000e-01  -4.6247e-01  -5.3490e-01   7.3570e-17
            0   7.0711e-01            0            0            0   7.0711e-01
            0  -7.0711e-01  -5.5511e-17   5.5511e-17   1.1102e-16   7.0711e-01
   5.0000e-01  -1.9854e-32  -5.0000e-01  -4.6247e-01  -5.3490e-01   1.9854e-32
  -5.0000e-01            0  -5.0000e-01  -5.3490e-01   4.6247e-01            0

但是当我用 numpy.linalg.eigh 对其进行对角化时,我得到了不同的结果,尽管特征值是相同的。这是 numpy 输出:

Numpy EigVec = 
+0.2483         +0.0000         +0.6621         +0.3467         +0.0000         +0.6163
+0.6621         +0.0000         +0.2483         +0.6163         +0.0000         +0.3467
+0.0000         +0.7071         +0.0000         +0.0000         +0.7071         +0.0000
+0.0000         +0.7071         +0.0000         +0.0000         +0.7071         +0.0000
+0.6621         +0.0000         +0.2483         +0.6163         +0.0000         +0.3467
+0.2483         +0.0000         +0.6621         +0.3467         +0.0000         +0.6163

非常感谢您对理解这种差异的任何帮助:)

PS:我使用的是 armadillo v10.2、numpy v1.20 和 python 3.8.5,这是我的代码:

import numpy as np
from numpy.linalg import eigh as LA
Re = [[1.0000e+00,1.0000e+00]]
H = np.array(Re)
_,H =  LA(H)
print("Numpy EigVec = ")
for i in range(H.shape[0]):
    for j in range(H.shape[0]):
        print("{:+.4f}\t\t".format(H[i,j]),end="")
    print()
#include <iostream>
#include <complex>
#include <armadillo>
#include <vector>
#define N 6
using namespace std ;
int main(){
    vector<vector<double>> Re{
        {1.0000e+00,2.8284e-01},{          0,-7.6328e-17},0},{-6.5919e-17,{ 2.8284e-01,1.0000e+00}};
    arma::Mat<double> H(N,N,arma::fill::zeros);
    for(size_t i=0;i<N;i++){for(size_t j=0;j<N;j++){H(i,j)=Re[i][j];}}
    arma::Col<double> e;
    arma::eig_sym(e,H,H);
    H.print("Arma EigVec : ") ;
    return 0 ;    
}

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...