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

时间:2018-11-16 13:38:17

标签: c++ eigen eigen3 mutability

我想对自定义矩阵向量乘积对象使用无矩阵稀疏求解器。这是一个很棒的示例-https://eigen.tuxfamily.org/dox/group__MatrixfreeSolverExample.html

但是在此示例中,由于generic_product_impl签名,自定义矩阵产品对象应保持不变

assert

在许多问题中,每个产品调用都需要大量临时缓冲区。一次分配它们是很明智的,但是我不能将它们存储在template<typename Dest> static void scaleAndAddTo( Dest& dst, const MatrixReplacement& lhs, const Rhs& rhs, const Scalar& alpha) 中,因为它是作为常量传递的。

在Eigen中可以克服这个问题吗?

1 个答案:

答案 0 :(得分:3)

有两个直接选择:

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

  2. 对于传播const,C ++并不十分严格。 const unique_ptr<T>在取消引用时将返回(非常量)T&(因为const表示“您不能更改指针”,而不是“您不能更改指针”;这是与内置指针相同)。您可以类似地将“真实的”稀疏矩阵类包装在伪装为const的东西中,但如果STL智能指针不足,则允许非const访问矩阵。如果给它起一个合适的名称,那么它听起来并不可怕。

我建议选择1。