2017-02-09 3 views
1

大規模な疎な対称行列(通常20,000〜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

ありがとうございました!私は1分以内に固有ベクトルと値を得ることができます。 –

+0

あなたが推奨する変更を作成しましたが、大幅なスピードアップが得られません。最大反復回数を増やしたり、許容誤差を下げたりして収束を緩和することは、実行時間を助けるようには見えません。 200k x 200kという大きさの行列の最初の3つまたは4つの固有ベクトルを計算するのにほとんど2分かかります。 –

関連する問題