You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 15:50:51