传递指针中的 Eigen::Ref

Posted

技术标签:

【中文标题】传递指针中的 Eigen::Ref【英文标题】:Eigen::Ref in pass-by-pointer 【发布时间】:2016-02-24 20:51:28 【问题描述】:

类似于提问Pointer vs Reference difference when passing Eigen objects as arguments

假设我们有 foo1 和矩阵 mat2by2:

void foo1(MatrixXd& container)
    //...container matrix is modified here

Matrix33d mat2by2;
mat2by2 << 1,2,
           3,4;

在阅读http://eigen.tuxfamily.org/dox/TopicFunctionTakingEigenTypes.html 之后,似乎 foo1 的更好替代方案可能是:

void foo2(Ref<MatrixXd> container)
    //...container matrix is modified here

如果 foo2 的参数作为引用传递, 使用 Eigen::Ref 类的指针传递等效于什么??

void foo(Eigen::MatrixXd* container)
    //...container matrix is modified here

【问题讨论】:

你试过了吗?好像是对的,有没有发现什么错误? 【参考方案1】:

我认为基本思想是直接使用指针或引用。 Eigen 使用模板表达式来表示计算。这意味着类型会根据用于计算矩阵的表达式而变化,并且表达式可能会在未计算的情况下进行。

如有必要,Ref 会将模板表达式评估为与您请求作为参数传递的内存布局匹配的临时对象。如果参数的内存布局与参数所需的内存布局相匹配,则 Ref 将充当透明引用。

直接从文档中借用:您的输入参数应该声明为常量,而非 const 参数可以用作输出参数。

void cov(const Ref<const MatrixXf> x, Ref<MatrixXf> C)

   ...
   C = ...; // Your return value here

如果你读写一个矩阵,参数显然也应该是非常量的。

对于可选参数,您可以使用指向 Ref 的指针。

编辑:文档确实注意到您可以直接使用常量引用来传递参数。这只是因为编译器很乐意将临时对象转换为常量引用。它不适用于指针。

【讨论】:

关于编辑:因此,如果将固定大小的矩阵传递给采用恒定固定大小矩阵参数的函数,则使用 Ref 实际上等同于“直接”传递- 参考,对吧?不应评估任何临时人员 (?) 如果使用非 const Ref,则不会出现临时性。如果由于内存布局不匹配而需要一个,那么它将无法编译。 const Ref,类似于 c++ const 引用,意味着如果内存布局不匹配,将创建一个临时对象。 我认为那里的事情还不清楚。根据文档,如有必要,参考 创建一个临时对象。模板表达式 will 被计算为一个 temp。如果可以的话,它将透明地引用而不是使用临时的。 const MyType& 具有比这更有限的语义。例如,它不会将双矩阵转换为浮点矩阵。编译器 乐于将模板表达式计算为临时值(因此是常量引用)。 我认为要点是使用模板或 Ref 以获得最大的灵活性。如果您了解警告,尽管 const& 也是可用的。除非您想在获取地址之前手动强制评估到与您的参数类型完全匹配的临时值,否则指针不可用。 例如,考虑一个参数将始终为 Matrix2d 的情况。在我看来,有趣的参数可以是(只读)=const Matrix2d&, const Ref, (writeable)= Matrix2d&, Matrix2d*, Ref。我的理解是,在使用 & 或 Ref 的情况下,对于这种特殊情况,不会发生临时事件(ggael 所说的 b/c,没有内存布局不匹配)。在这种情况下,Ref 和 & 之间确实没有区别。

以上是关于传递指针中的 Eigen::Ref的主要内容,如果未能解决你的问题,请参考以下文章

如何创建 Eigen::Ref 的向量

正确使用 Eigen::Ref<> 类

从 std::vector 创建 Eigen::Ref

如何使用 C++ 中的指针通过指针传递多维向量?

Qt:将指针传递给 QMimeData 中的 QObject

使用通过引用传递的参数(通过指针)优化 OpenCL 函数中的指针访问