特征向量和 Matlab 中的不同特征向量和特征值可能会产生错误

Different eigenvector and eigenvalues in Eigen and Matlab could generate errors?

本文关键字:特征 向量 错误 Matlab 特征值      更新时间:2023-10-16

就像在这里和这里解释的那样,特征值(以及相对特征向量及其符号)的命令是依赖于库的,并且(根据第一个链接问题)这应该不是问题。此外,相对于几乎为零的特征值的特征向量可以被视为垃圾。目前为止,一切都好。

现在,考虑下面我想使用Eigen库在C++重写的 MATLAB 代码:

%supposing K is 3x3 matrix
[V_K,D_K] = eig(K);
d_k = diag(D_K);
ind_k = find(d_k > 1e-8);
d_k(ind_k) = d_k(ind_k).^(-1/2);
K_half = V_K*diag(d_k)*V_K';

我的C++实现:

EigenSolver<Matrix3f> es (K,true);
auto v = es.eigenvalues();
//set to zero if eigenvalues too smal, otherwise v^(-1/2)
v = (v.array().real() > 1e-8).select(v.cwiseSqrt().cwiseInverse(), 0);
auto KHalf = es.eigenvectors()*v.asDiagonal()*es.eigenvectors().inverse();

问题是K_half值与 KHafl 不同,从打印结果中可以看出:

矩阵:

V_K =
    0.5774    0.8428   -0.0415
    0.5774   -0.3806   -0.7468
    0.5774   -0.3806    0.6638

D_K =
   17.0000         0         0
         0    2.0000         0
         0         0   -0.0000
K_half =
    0.5831   -0.1460   -0.1460
   -0.1460    0.1833    0.1833
   -0.1460    0.1833    0.1833
eigenvalues=
 (2,0)
(17,0)
 (0,0)
eigenvectors=
(-0.842777,0)   (0.57735,0) (-0.041487,0)
 (0.380609,0)   (0.57735,0) (-0.746766,0)
 (0.380609,0)   (0.57735,0)  (0.663792,0)
KHalf=
(0.0754555,-3.9918e-310)  (0.0764066,1.9959e-310)  (0.0906734,1.9959e-310)
           (-0.144533,0)             (0.186401,0)             (0.200668,0)
           (-0.144533,0)             (0.186401,0)             (0.200668,0)

问题是我不知道这种差异是否会成为算法其余部分的差异(为了完整性,我在问题末尾发布)。据我了解,无法保证两个库中的特征向量相同(因为存在多个特征向量并且它们是成本不变的)。我有必要担心这个吗?最终,我该如何解决它?

Matlab 算法的其余部分:

% p and b int parameters , W and H returned
%create indices for the t random points for each hash bit
%then form weight matrix
for i = 1:b
    rp = randperm(p);
    I_s(i,:) = rp(1:t);
    e_s = zeros(p,1);
    e_s(I_s(i,:)) = 1;
    W(:,i) = sqrt((p-1)/t)*K_half*e_s;
end
H = (K*W)>0;
W = real(W);

多亏了两个答案的评论,我才想出了问题所在:

Eigen::MatrixXcf KHalf = es.eigenvectors()*v.asDiagonal()*es.eigenvectors().transpose();

(使用transpose()Eigen::MatrixXcf诀窍)