稀疏求解器的特征非常数 MatrixReplacement

Eigen non constant MatrixReplacement for sparse solver

我想将无矩阵稀疏求解器与自定义矩阵向量乘积对象一起使用。这是一个很好的例子如何做到这一点 - https://eigen.tuxfamily.org/dox/group__MatrixfreeSolverExample.html

但在此示例中,由于 generic_product_impl 签名

,自定义矩阵乘积对象应该是常量
template<typename Dest>
static void scaleAndAddTo(
    Dest& dst, 
    const MatrixReplacement& lhs, 
    const Rhs& rhs, 
    const Scalar& alpha)

在我的许多问题中,我需要为每个产品调用提供大量临时缓冲区。分配一次是非常明智的,但我不能将它们存储在 MatrixReplacement 中,因为它作为 const.

传递

Eigen中是否可以解决这个问题?

有两个直接选项:

  1. 对需要在 const 方法中更改的成员(即您的临时缓冲区)使用 mutable 关键字。尽管您需要修改成员,但是当您的 class const 的可观察行为时,此关键字是有意义的。示例包括缓存值、互斥体或您的缓冲区。

  2. C++ 对传播 const 并不完全严格。 A const unique_ptr<T> 将 return a (non-const) T& 取消引用时(因为 const 表示 "you can't change the pointer",而不是 "you can't change the pointee";这与内置指针相同).您可以类似地将 "real" 稀疏矩阵 class 包装在假装为 const 的东西中,但如果 STL 智能指针不足,则允许对矩阵进行非常量访问。如果你给它一个合适的名字,那么它并不像听起来那么可怕。

我推荐选项 1。