【问题标题】:Solve linear system using iterative method with solveWithGuess and a sparse b vector in Eigen使用带有solveWithGuess和Eigen中的稀疏b向量的迭代方法求解线性系统
【发布时间】: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 转换为密集向量吗?那是非常低效的。

【问题讨论】:

    标签: c++ eigen eigen3


    【解决方案1】:

    EigenEigen::BiCGSTAB 文档中的公共函数列表:

    Inherited from Eigen::IterativeSolverBase<BiCGSTAB<_MatrixType, _Preconditioner>>
    const SolveWithGuess<BiCGSTAB<_MatrixType, _Preconditioner>, Rhs, Guess> solveWithGuess(const MatrixBase<Rhs> &b, const Guess &x0) const
    
    Inherited from Eigen::SparseSolverBase<Derived>
    template<typename Rhs>
    const Solve<Derived, Rhs> solve(const MatrixBase<Rhs> &b) const
     
    template<typename Rhs>
    const Solve<Derived, Rhs> solve(const SparseMatrixBase<Rhs> &b) const
    

    如您所见,solve 有两种实现方式,一种采用稀疏参数,另一种采用密集参数。

    至于solveWithGuess,只有一种实现采用密集参数。

    那是因为solve 来自最顶层、最普通的类SparseSolverBase。 solveWithGuess 来自 IterativeSolverBase 派生自 SparseSolverBase 和 IterativeSolverBase 不适用于稀疏参数。

    所以这个函数只是不在库中,但我不知道它不存在的原因。

    【讨论】:

    • 谢谢。是的,我注意到 Eigen 缺少 solveWithGuess 的重载,它需要 SparseMatrixBase。我的问题是为什么它会丢失,以及除了转换为密集向量之外是否还有其他选择。
    • 稀疏线性系统的解本身不太可能是稀疏的。一次将稀疏猜测转换为密集向量通常应该比对实际上密集的向量执行稀疏操作更便宜。
    • @chtz 这实际上不是重点。由于某种原因,不能稀疏的是b 向量,而不是猜测向量。这对我来说没有意义。
    猜你喜欢
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多