我希望求解大型稀疏对称矩阵(通常为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;
}
答案 0 :(得分:0)
您的代码示例是融合密集矩阵。首先要正确组装Eigen::SparseMatrix<double>
详细there。然后,在Spectra端,使用相应的SparseSymShiftSolve
助手。
另外,不要忘记使用编译器优化ON进行编译。这对于这样的仅头文件库很重要。