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