稀疏求解器的特征非常数 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中是否可以解决这个问题?
有两个直接选项:
对需要在 const
方法中更改的成员(即您的临时缓冲区)使用 mutable
关键字。尽管您需要修改成员,但是当您的 class 是 const 的可观察行为时,此关键字是有意义的。示例包括缓存值、互斥体或您的缓冲区。
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。
我想将无矩阵稀疏求解器与自定义矩阵向量乘积对象一起使用。这是一个很好的例子如何做到这一点 - 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中是否可以解决这个问题?
有两个直接选项:
对需要在
const
方法中更改的成员(即您的临时缓冲区)使用mutable
关键字。尽管您需要修改成员,但是当您的 class 是 const 的可观察行为时,此关键字是有意义的。示例包括缓存值、互斥体或您的缓冲区。C++ 对传播
const
并不完全严格。 Aconst 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。