Какой самый быстрый решатель собственных значений в библиотеке Spectra для огромной разреженной симметричной матрицы?

Я хотел бы решить собственные значения для большой разреженной симметричной матрицы (обычно порядка 20 000 — 60 000). Я попытался использовать SymEigsShiftSolver / SymEigsSolver, но для получения собственных значений требуется значительное время. Есть ли способ для ускорения ?? Я приложил демонстрационный код того, что я собираюсь сделать. Я что-то пропустил??

int main ()
{

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;

}

2

Решение

Вы пример кода слияния плотных матриц. Первое, что нужно правильно собрать Eigen::SparseMatrix<double> как подробно там. Затем на стороне Spectra используйте соответствующие SparseSymShiftSolve помощник.

Также не забудьте скомпилировать с включенной оптимизацией компилятора. Это важно для такой заголовочной библиотеки.

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector