2017-02-09 143 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。 –

相关问题