2017-02-09 141 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

您的代碼示例熔合稠密矩陣。首先要按照詳細的there正確組裝Eigen::SparseMatrix<double>。然後,在Spectra端,使用相應的幫助器SparseSymShiftSolve

此外,不要忘記編譯優化ON。這對於這種僅包含頭文件的庫很重要。

+0

非常感謝!現在我可以在一分鐘內獲得特徵向量和值。 –

+0

我產生了你推薦的改變,但我沒有得到顯着的加速。通過增加最大迭代次數或減小容差來放寬收斂似乎沒有幫助運行時間。計算矩陣的前3或4個特徵向量幾乎需要2分鐘,大到200k x 200k。 –

相關問題