特征向量和 Matlab 中的不同特征向量和特征值可能会产生错误
Different eigenvector and eigenvalues in Eigen and Matlab could generate errors?
就像在这里和这里解释的那样,特征值(以及相对特征向量及其符号)的命令是依赖于库的,并且(根据第一个链接问题)这应该不是问题。此外,相对于几乎为零的特征值的特征向量可以被视为垃圾。目前为止,一切都好。
现在,考虑下面我想使用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
诀窍)
相关文章:
- C++ 中的特征向量计算
- 在其特征向量上投影点云
- 特征::向量;在函数中使用 Eigen::Matrix3f 的值初始化向量,大于 4 个条目
- 动态分配特征向量的模因
- 特征向量与法巴德
- 将特征向量序列化为 QDataStream
- 为什么特征向量这么慢?
- C++ 查找矩阵的特征值和特征向量
- 特征向量对数无效使用不完整类型的错误
- 使用 c++ 特征库中的特征向量() 只计算一个特征向量
- 将特征向量复制到 C 数组
- SymEigsShiftSolver of Spectra是否不返回特征向量?
- 包含特征向量的类的奇异大小
- 将特征数组转换为特征向量
- 特征:如何将"greater than"的结果(在ArrayXf上)转换为特征向量
- 计算Armadillo中复杂对称矩阵的有限特征向量的正确函数
- 近似大型对称矩阵的最高3个特征值和特征向量的快速方法
- 按升序对特征向量Xf进行排序
- 特征向量矩阵右除问题
- 动态分配随机特征向量Xd