我试图找到laplacian的2个最小特征值的2个eignevector。我这样做是
[v,c]=eigs(L,M,2,'SM');
L
是lapalcian,M
是质量矩阵。
结果我收到了错误
Error using eigs/checkInputs/LUfactorAminusSigmaB (line 1041)
The shifted operator is singular. The shift is an eigenvalue.
Try to use some other shift please.
Error in eigs/checkInputs (line 855)
[L,U,pp,qq,dgAsB] = LUfactorAminusSigmaB;
Error in eigs (line 94)
[A,Amatrix,isrealprob,issymA,n,B,classAB,k,eigs_sigma,whch, ...
这是否意味着我做错了什么,或者这只是matlab为其迭代过程选择了错误的初始猜测?
我使用的矩阵应该有一个下降条件数...
答案 0 :(得分:1)
我在实现规范化剪切分割时遇到了同样的问题。条件数实际上是无穷大的,因为最小的特征值是0,这基本上是MATLAB的错误信息。它首先运行LU分解。
我刚刚将I,10 * eps * speye的倍数添加到标准化拉普拉斯算子中以改善条件并修复它。
答案 1 :(得分:-1)
我的eigs功能遇到了同样的问题。所以我采取了长期(也许是愚蠢的)方式,但它完成了我的工作,因为我的问题不是那么大:(我会尽力保持你的记号)
%使用完整矩阵解决特征值问题
[v,c]=eig(full(L),full(M));
%使用sort函数对特征值进行排序(“ - ”符号是因为你想要最小的实数特征值)
[E,P] = sort(real(c),'descend'); % Here I am assuming you know all the eigenvalues have` negative real parts
%现在P是一个向量,它包含(按顺序)由%函数排序操作的行排列的索引。 %为了获得对应于2个最小特征值的两个特征向量:
for k = 1:2
index = P(k);
lambda(k) = c(index,index); % use this to check if c(index,index)=E(k,k)
eigvec(:,k) = v(:,index); % corresponding eigenvector
end
希望这有帮助