我想对自定义矩阵向量乘积对象使用无矩阵稀疏求解器。这是一个很棒的示例-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中可以克服这个问题吗?
答案 0 :(得分:3)
有两个直接选择:
使用mutable
关键字表示需要在const
方法(即您的临时缓冲区)中进行更改的成员。尽管您需要修改成员,但该关键字在类 的可观察行为是有意义的地方有意义。示例包括缓存的值,互斥锁或缓冲区。
对于传播const
,C ++并不十分严格。 const unique_ptr<T>
在取消引用时将返回(非常量)T&
(因为const表示“您不能更改指针”,而不是“您不能更改指针”;这是与内置指针相同)。您可以类似地将“真实的”稀疏矩阵类包装在伪装为const的东西中,但如果STL智能指针不足,则允许非const访问矩阵。如果给它起一个合适的名称,那么它听起来并不可怕。
我建议选择1。