Eigen和Matlab中不同的特征向量和特征值会产生错误吗?

时间:2016-07-12 11:25:59

标签: c++ matlab eigen

就像它解释herehere特征值的orde(以及相对特征向量及其符号)是依赖于库的(根据第一个相关问题)它不应该是一个问题。另外,相对于几乎为零的特征值的特征向量可以被认为是垃圾。到目前为止一切都很好。

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

%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不同,正如您从打印结果中看到的那样:

Matlab的:

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);

1 个答案:

答案 0 :(得分:0)

感谢两位回答的评论,我发现了问题所在:

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

(使用transpose()Eigen::MatrixXcf制作技巧)