eig 與eigs

eig 一般用來解決小規模的矩陣,如果矩陣比較稀疏或奇異,會出現“EIG did not converge.”的錯誤,例如我在求下面一個1200*1200的稀疏矩陣M時就出現了下面的錯誤
[v1,c1] = eig(M1);
Error using eig
EIG did not converge.
可嘗試如下解決方案:
(1)用eigs求解:
options.disp = 0; options.isreal = 1; options.issym = 1;
[v1,c1] = eigs(sparse(M1),d+1,0,options);
或者 [v1,c1] = eigs(M1,d+1,0,options);
這兩個語句求出的特徵值不一樣,不知道哪一個求出來的更好,希望有大神可以指導,
不過不管怎麼樣,不再報錯了
(2)用eig求解
[v1,c1] = eig(M1+1e-6);
這樣求出的特徵值是可以篩選的,可以求出所有特徵值,然而eigs只能求出指定的多少個特徵值,對於求出所有的特徵值並不方便。
eigs 一般用來解決大型、稀疏矩陣, 當我要求一個更大型的稀疏矩陣的特徵值特徵向量時,此時eig失效
例如,求一個9394*9394的稀疏矩陣M:
[v1,c1] = eig(M);
Error using eig
Input to EIG must not contain NaN or Inf.
但我仔細檢查了我的M不含有NAN和inf
於是換用eigs:
[v1,c1] = eigs(M,d+1,0,options);
Error using eigs (line 249)
Error with ARPACK routine znaupd: info = -9999
再換:
[v1,c1] = eigs(sparse(M),d+1,0,options);
Error using eigs/checkInputs/LUfactorAminusSigmaB (line 1003)
The shifted operator is singular. The shift is an eigenvalue.
Try to use some other shift please.
如今卡在這兒不知道怎麼解決了,之前用eigs也出現過類似的情況,換用eig就可以了,但此時M過大,換eig也不行了,做如下嘗試仍然不行
[ri,rj]=find(M); [v1,c1] = eigs(sparse(M)+sparse(ri,rj,1e-6),d+1,0,options);
Error using eigs/checkInputs/LUfactorAminusSigmaB (line 1003)
The shifted operator is singular. The shift is an eigenvalue.
Try to use some other shift please.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章