2017-02-09 12 views
1

Я хочу решить собственные значения для большой разреженной симметричной матрицы (обычно порядка 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; 

}

ответ

0

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

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

+0

Большое спасибо! Я могу получить собственные векторы и значения через минуту. –

+0

Я подготовил изменения, которые вы рекомендовали, но я не получаю значительное ускорение. Расслабление конвергенции за счет увеличения максимальных итераций или уменьшения допуска, по-видимому, не помогает времени выполнения. Для вычисления первых 3 или 4 собственных векторов матрицы размером до 200k x 200k требуется почти 2 минуты. –