c++ - 在 Eigen 中提高 SelfAdjointEigenSolver 的精度

标签 c++ eigen eigenvalue eigenvector eigen3

我正在尝试确定 Eigen 中稀疏数组的特征值和特征向量。由于我需要计算所有特征向量和特征值,并且我无法使用不受支持的 ArpackSupport 模块工作来完成此操作,因此我选择将系统转换为密集矩阵并使用 SelfAdjointEigenSolver 计算特征系统(我知道我的矩阵是真实的并且具有实特征值)。在我拥有大小为 1024*1024 的矩阵之前,此方法运行良好,但随后我开始与预期结果出现偏差。

根据我的理解,在该模块 ( https://eigen.tuxfamily.org/dox/classEigen_1_1SelfAdjointEigenSolver.html) 的文档中,可以更改最大迭代次数:

const int m_maxIterations static Maximum number of iterations.

The algorithm terminates if it does not converge within m_maxIterations * n iterations, where n denotes the size of the matrix. This value is currently set to 30 (copied from LAPACK).

但是,我不明白你是如何实现的,使用他们的例子:

SelfAdjointEigenSolver<Matrix4f> es;
Matrix4f X = Matrix4f::Random(4,4);
Matrix4f A = X + X.transpose();
es.compute(A);
cout << "The eigenvalues of A are: " <<   es.eigenvalues().transpose() << endl;
es.compute(A + Matrix4f::Identity(4,4)); // re-use es to compute eigenvalues of A+I
cout << "The eigenvalues of A+I are: " << es.eigenvalues().transpose() << endl

您将如何修改它以更改最大迭代次数?

此外,这会解决我的问题,还是我应该尝试寻找替代函数或算法来求解特征系统?

提前致谢。

最佳答案

增加迭代次数不太可能有帮助。另一方面,从 float 移动到 double 会有很大帮助!

如果这没有帮助,请更具体地说明“与预期结果的偏差”。

关于c++ - 在 Eigen 中提高 SelfAdjointEigenSolver 的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39837808/

相关文章:

c++ - 不完整类型 : class usage before definition vs. 前向声明

c++ - OpenCV CV::Mat 和 Eigen::Matrix

c++ - 从 C++ 中的文件读取时如何忽略坏数据?

c++ - Eigen 矩阵是否支持 vector 索引?

python - Python 中的 eig(a,b) 给出错误 "takes 1 positional argument but 2 were given"

c++ - 将短列表合并为长 vector 的算法

c++ - 如何在 Eigen 库中手动构建复杂矩阵?

c++ - 使用 Eigen 和 std::vector 的 SIGSEGV

c++ - LAPACK 中的 DGGEV 或 DSYGV Eigen 求解器执行哪种算法? MATLAB使用的是 'QZ'算法吗?

sparse-matrix - 寻找大矩阵的 k 个最小特征值及其对应的特征向量