eigs_sym用于获得具有最小幅度的特征值的问题

时间:2016-03-17 11:50:45

标签: c++ qt armadillo

我试图获得具有最小平方对称矩阵的有限数量的特征值。 要做到这一点,我首先使用犰狳文档中的示例(http://arma.sourceforge.net/docs.html#eigs_sym):

sp_mat A = sprandu<sp_mat>(1000, 1000, 0.1);
sp_mat B = A.t()*A;
arma::vec eigval;
mat eigvec;
eigs_sym(eigval, eigvec, B, 10, "sm");//i add "sm" to get the eigen-  
                                      //values of smallest magnitude
cout<<eigval<<endl; 

这里我得到一个错误,说ddcomposition失败[未能收敛]。

但是,当我像这样调用eigs_sym时:

eigs_sym(eigval, eigvec, B, 10); //obtain the eigen-values with 
                                 //LARGEST magnitude (default call)

这项工作做得很好,我得到了预期的结果:

1.1596e+02
1.1680e+02
1.1785e+02
1.1815e+02
1.1927e+02
1.2017e+02
1.2108e+02
1.2256e+02
1.2323e+02
2.5413e+03

我在Ubuntu Os上,这是我的.pro文件(Qt):

 LIBS += -lgsl -lgslcblas -lX11 -lpthread -llapack  -lm -fopenmp   
         -larmadillo

是否有解决此问题的想法?

谢谢

1 个答案:

答案 0 :(得分:1)

我通过选择更多数量的特征值来解决这个问题。 显然,要提取的特征值较少,使得本征解算器会收敛。如果你替换

eigs_sym(eigval, eigvec, B, 10,"sm")

通过

eigs_sym(eigval, eigvec, B, 100,"sm")

这会奏效。