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

标签 c++ eigen eigen3 mutability

我想将无矩阵稀疏求解器与自定义矩阵 vector 乘积对象一起使用。这是一个很好的例子如何做到这一点 - 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. 使用 mutable const 中需要更改的成员的关键字方法(即你的临时缓冲区)。这个关键字在类的可观察行为常量的情况下有意义,尽管您需要修改成员。示例包括缓存值、互斥体或您的缓冲区。

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

我推荐选项 1。

关于c++ - 稀疏求解器的特征非常数 MatrixReplacement,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53338985/

相关文章:

c++ - 如何实现类似于 std::vector 的自定义类

c++ - 如何镜像矩阵的其中一个维度?

c++ - Eigen::Ref<> 与 std::reference_wrapper<> 的优缺点是什么?

c++11 - 特征对齐问题

c# - 将 C++ 对象传递给 C#

c++ - 在 C++ 中使用用户定义的类型作为映射值

c++ - C++ 基本类型列表

c++ - 我应该如何从 Eigen 3中的张量切片中获取 vector ?

android - 在 android ndk 中使用 Eigen

c++ - 与不完整的 cholesky 预处理器共轭梯度会返回 Eigen 库的意外错误