Я пытаюсь определить собственные значения и собственные векторы разреженного массива в Eigen. Поскольку мне нужно вычислить все собственные векторы и собственные значения, и я не мог этого сделать, используя неподдерживаемый модуль ArpackSupport, я решил преобразовать систему в плотную матрицу и вычислить систему eigens с использованием SelfAdjointEigenSolver (я знаю, что моя матрица реальна и имеет вещественные собственные значения). Это хорошо работает, пока у меня не будет матриц размером 1024 * 1024, но затем я начну получать отклонения от ожидаемых результатов.Увеличение точности в SelfAdjointEigenSolver in Eigen
В документации этого модуля (https://eigen.tuxfamily.org/dox/classEigen_1_1SelfAdjointEigenSolver.html) от того, что я понял, что можно изменить число итераций макс:
Const ИНТ m_maxIterations статического Максимального числа итераций.
Алгоритм завершается, если он не сходится в пределах m_maxIterations * n итераций, где n обозначает размер матрицы. Это значение в настоящее время установлено на 30 (скопировано из 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
Как бы вы изменить его, чтобы изменить максимальное число итераций?
Кроме того, это решит мою проблему или я должен попытаться найти альтернативную функцию или алгоритм для решения системы eigensystem?
Мое спасибо заранее.
Вы хотите сказать Якоби SVD? Если бы вы могли подробно рассказать о том, как я могу получить Eigevalues и Eigenvectors из этого разложения? – jcarvalho