eigs_sym 问题以获得最小幅度的特征值
issue with eigs_sym for obtaining eigenvalues with smallest magnitude
我正在尝试获得有限数量的平方对称矩阵的最小幅值的特征值。
为此,我首先使用 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
有解决此问题的想法吗?
谢谢
我通过选择更多的特征值来提取来解决这个问题。
显然,要提取的特征值数量较少会使特征求解器注意收敛。如果你替换
eigs_sym(eigval, eigvec, B, 10,"sm")
来自
eigs_sym(eigval, eigvec, B, 100,"sm")
这会奏效。
我正在尝试获得有限数量的平方对称矩阵的最小幅值的特征值。 为此,我首先使用 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
有解决此问题的想法吗?
谢谢
我通过选择更多的特征值来提取来解决这个问题。 显然,要提取的特征值数量较少会使特征求解器注意收敛。如果你替换
eigs_sym(eigval, eigvec, B, 10,"sm")
来自
eigs_sym(eigval, eigvec, B, 100,"sm")
这会奏效。