计算eigs时出现Cryptic matlab错误

时间:2012-11-26 15:41:08

标签: matlab runtime-error eigenvector

我试图找到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为其迭代过程选择了错误的初始猜测?

我使用的矩阵应该有一个下降条件数...

2 个答案:

答案 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

希望这有帮助