【发布时间】:2022-01-03 18:49:11
【问题描述】:
我目前正在使用 Eigen 3.4.0 求解线性方程组 Ax=b,其中 A 和 b 都是稀疏的。我正在使用 BiCGSTAB 方法,它是迭代的,如下所示:
Eigen::SparseMatrix<double> A;
Eigen::SparseVector<double> b;
Eigen::BiCGSTAB<SparseMat, Eigen::IncompleteLUT<double>> solver;
solver.compute(A);
Eigen::SparseVector<double> x = solver.solve(b).eval();
事实证明,在某些情况下,我可能有一个初步的猜测,我可以给求解器(也是一个稀疏向量)。所以我的第一直觉是这样做:
Eigen::SparseVector<double> x0;
Eigen::BiCGSTAB<SparseMat, Eigen::IncompleteLUT<double>> solver;
solver.compute(A);
Eigen::SparseVector<double> x = solver.solveWithGuess(b, x0).eval();
但我收到错误 No matching member function for call to 'solveWithGuess'。好吧,为什么?所以我尝试了这段代码:
Eigen::SparseVector<double> sv;
VectorXd dv;
solver.solveWithGuess(sv, dv); // ERROR
solver.solveWithGuess(dv, sv); // OK
solver.solveWithGuess(sv, sv); // ERROR
solver.solveWithGuess(dv, dv); // OK
显然,即使我可以用稀疏的b 向量调用solve,我也必须用密集的b 向量调用solveWithGuess。为什么?在调用solveWithGuess 之前,我唯一的选择真的是将b 转换为密集向量吗?那是非常低效的。
【问题讨论】: