使用 Eigen 求解线性方程组

计算科学 C++ 本征
2021-12-02 00:26:06

我正在尝试使用 Eigen 库在 C++ 中求解线性方程组。对于简单的方程 Ax=b,我有一个稀疏矩阵 A,它是 nxn,b 的已知值是 nx 1,但我需要找到 x 的值。我尝试使用

x = A.colPivHouseholderQr().solve(b);

但这解决了密集矩阵的问题,并且由于我的“n”值非常大,我需要找到一种方法来使用特定于稀疏矩阵的实现来做到这一点。我研究过使用 SparseLU,但在尝试找出它背后的语法时遇到了麻烦。特征在线说要写这样的东西:

SparseLU<SparseMatrix<scalar>, COLAMDOrdering<Index>> solver;
solver.analyzePattern(A);
solver.factorize(A);
x = solver.solve(b);

但是当我运行它时,我收到错误说他们不知道标量和索引是什么。有没有人使用过 SparseLU 并知道实现它背后的语法?

1个回答
Eigen::SparseLU<Eigen::SparseMatrix<double> > solverA;
A.makeCompressed();
solverA.analyzePattern(A);
solverA.factorize(A);

if(solverA.info()!=Eigen::Success) {
    std::cout << "Oh: Very bad" <<"\n";
 }
else{
     std::cout<<"okay computed"<<"\n";
 }
Eigen::VectorXd solnew = solverA.solve(b);

您无需提及 COLAMDOrdering,但如果您愿意,可以将求解器声明为:

Eigen::SparseLU<Eigen::SparseMatrix<double>, Eigen::COLAMDOrdering<int> > solver;

PS:更多关于 COLAMDOrdring 的信息可以在这里找到。