Я хотел бы решить собственные значения для большой разреженной симметричной матрицы (обычно порядка 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;
}
Вы пример кода слияния плотных матриц. Первое, что нужно правильно собрать Eigen::SparseMatrix<double>
как подробно там. Затем на стороне Spectra используйте соответствующие SparseSymShiftSolve
помощник.
Также не забудьте скомпилировать с включенной оптимизацией компилятора. Это важно для такой заголовочной библиотеки.
Других решений пока нет …