就像它解释here和here特征值的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);
答案 0 :(得分:0)
感谢两位回答的评论,我发现了问题所在:
Eigen::MatrixXcf KHalf = es.eigenvectors()*v.asDiagonal()*es.eigenvectors().transpose();
(使用transpose()
和Eigen::MatrixXcf
制作技巧)