Eigen、Numpy、LAPACKE等库特征向量结果不一致问题咨询
从2D点云估计椭圆参数时的特征向量差异问题
在从2D点云估计椭圆参数的算法中,使用如下double类型矩阵M:
55.774375 61.0225 62.805625 -122.045 -125.61125 -122.045 62.805625 61.0225 55.774375
使用Numpy、Eigen C++、LAPACKE、Intel MKL计算该矩阵的特征值与右特征向量时,特征值完全一致:
[-5.09420041e-13 -7.03125000e+00 -7.03125000e+00]
但各库输出的特征向量差异显著,具体情况如下:
1. Numpy代码及结果
M = np.array([[55.774375, 61.0225, 62.805625], [-122.045, -125.61125, -122.045, ], [62.805625, 61.0225, 55.774375]]) eval, evec = np.linalg.eig(M)
输出特征向量:
[[ 0.41608575 0.37443021 -0.80942954] [-0.80854518 -0.82367703 0.34119147] [ 0.41608575 0.42586167 0.47792489]]
2. Eigen C++代码及结果
Eigen::Matrix3d M; M << 55.774375, 61.0225, 62.805625, -122.045, -125.61125, -122.045, 62.805625, 61.0225, 55.774375; Eigen::EigenSolver<Eigen::MatrixXd> solver; solver.compute(M);
输出特征向量:
0.416086 0.376456 -0.462421 -0.808545 -0.823758 0.820878 0.416086 0.423914 -0.335151
3. LAPACKE代码及结果
double Marr[]{55.774375, 61.0225, 62.805625, -122.045, -125.61125, -122.045, 62.805625, 61.0225, 55.774375}; char jobvl = 'N'; char jobvr = 'V'; int n=3; int lda = n; int ldvl = n; int ldvr = n; int lwork = -1; int info; double wr[n], wi[n], vl[ldvl*n], vr[ldvr*n]; LAPACKE_dgeev( LAPACK_ROW_MAJOR, 'V', 'V', n, Marr, lda, wr, wi, vl, ldvl, vr, ldvr ); if( info > 0 ) { printf( "The algorithm failed to compute eigenvalues.\n" ); exit( 1 ); }
输出特征向量:
0.416086 0.376456 -0.788993 -0.808545 -0.823758 0.565975 0.416086 0.423914 0.239087
注:Intel MKL结果与LAPACKE类似,且矩阵M的行列式接近0(-4.0031989907207254e-05)
核心疑问
- 为何相同特征值对应的特征向量在不同库中差异显著?是否因采用不同的数值近似方法?
- 已知特征值d的特征向量v的标量倍数q*v也是d的特征向量,但对于本案例中的重特征值,不同库的特征向量无法通过标量缩放转换,这是为何?
此外,该算法在Python中可正常运行,但在C++中因特征向量差异而失败,恳请提供解决办法。
内容的提问来源于stack exchange,提问作者peschn
相关产品推荐
相关产品推荐

