Я хочу решить собственные значения для большой разреженной симметричной матрицы (обычно порядка 20000 - 60 000). Я попытался использовать SymEigsShiftSolver/SymEigsSolver, но для получения моих собственных значений требуется значительное количество времени. Есть ли способ ускорения? Я приложил демо-код того, что я собираюсь сделать. Я что-то упускаю??Какой самый быстрый решатель собственных значений в библиотеке Spectra для огромной разреженной симметричной матрицы?
INT основной() {
Eigen::MatrixXd A = Eigen::MatrixXd::Random(10000, 10000);
Eigen::MatrixXd M = A.transpose() * A;
// Matrix operation objects
DenseGenMatProd<double> op_largest(M);
DenseSymShiftSolve<double> op_smallest(M);
// Construct solver object, requesting the smallest 10 eigenvalues
SymEigsShiftSolver< double, LARGEST_MAGN, DenseSymShiftSolve<double> >
eigs_smallest(&op_smallest, 10, 30, 0.0);
eigs_smallest.init();
eigs_smallest.compute();
std::cout << "Smallest 10 Eigenvalues :\n" <<
eigs_smallest.eigenvalues() << std::endl;
return 0;
}
Большое спасибо! Я могу получить собственные векторы и значения через минуту. –
Я подготовил изменения, которые вы рекомендовали, но я не получаю значительное ускорение. Расслабление конвергенции за счет увеличения максимальных итераций или уменьшения допуска, по-видимому, не помогает времени выполнения. Для вычисления первых 3 или 4 собственных векторов матрицы размером до 200k x 200k требуется почти 2 минуты. –