正确使用 Eigen::Ref<> 类

Posted

技术标签:

【中文标题】正确使用 Eigen::Ref<> 类【英文标题】:Correct usage of the Eigen::Ref<> class 【发布时间】:2014-02-03 15:12:32 【问题描述】:

Eigen 引入了 Ref 类来编写以 Eigen 对象作为参数的函数,而无需使用不必要的临时变量,当不需要编写模板函数时。可以阅读此here。

当进一步搜索互联网时,我发现了几个使用 Ref 类的不同参数声明。在 Eigen 文档中,他们在第一个示例中使用 const Eigen::Ref&lt;const Eigen::MatrixXf&gt;&amp; 作为只读参数。在第二个示例中,Eigen::Ref&lt;Eigen::MatrixXd&gt; 用于读写参数,但这里const Eigen::Ref&lt;const Eigen::MatrixXd&gt; 用于只读参数(无参考)。所以我的问题是:

以下声明有什么区别,什么时候使用?`

    const Eigen::Ref&lt;const Eigen::MatrixXd&gt;&amp; const Eigen::Ref&lt;const Eigen::MatrixXd&gt; const Eigen::Ref&lt;Eigen::MatrixXd&gt;&amp; const Eigen::Ref&lt;Eigen::MatrixXd&gt; Eigen::Ref&lt;const Eigen::MatrixXd&gt;&amp; Eigen::Ref&lt;const Eigen::MatrixXd&gt; Eigen::Ref&lt;Eigen::MatrixXd&gt;&amp; Eigen::Ref&lt;Eigen::MatrixXd&gt;

为了完整起见,我列出了 const 用法和引用的所有可能组合。

【问题讨论】:

就我个人而言,我会将const Eigen::Ref&lt;const Eigen::MatrixXd&gt; 用于只读参数,Eigen::Ref&lt;Eigen::MatrixXd&gt; 用于读写参数。但我不确定参考 (&amp;)。 【参考方案1】:

一般来说,使用像 Ref&lt;T&gt;&amp; 这样的非 const 引用绝不是一个好主意,因为这只有在调用者手头已有 Ref&lt;T&gt; 对象时才有效。这会丢弃 5 和 7。

案例 3 和 4 没有意义,一般不会编译。

那么,const Ref&lt;const T&gt;const Ref&lt;const T&gt;&amp; 之间没有太大区别,因为不太可能使用现有的 Ref&lt;const T&gt; 对象调用该函数,因此大多数情况下都必须创建 Ref&lt;const T&gt;无论如何。尽管如此,我们仍然可以推荐 1 而不是 2 或 6。

因此,总而言之,我们可以推荐 Ref&lt;T&gt; 用于可写引用,const Ref&lt;const T&gt;&amp; 用于 const 引用。

如果您想通过使用placement new 调用Ref 构造函数来更改引用的矩阵(而不是其内容),则选项6 Ref&lt;const T&gt; 可能仍然很有趣。

【讨论】:

你能详细说明为什么你会推荐const Ref&lt;const T&gt;&amp;(有&amp;)而不是const Ref&lt;const T&gt;(没有&amp;)吗?似乎没有 &amp; 它会涉及 Ref 对象的副本(我认为这很便宜)。在非常量情况下,Ref 对象无论如何都会被复制,对吗?那么通过Ref&amp;Ref 时的性能会有所不同吗? 这是因为如果T 是固定大小的静态分配类型,例如Matrix4d,那么 Ref 必须存储一个 Matrix4d 作为属性,以防传递的对象是不兼容。因此,与总是便宜的Ref&lt;T&gt; 不同,Ref&lt;const T&gt; 可能更重。 是否有办法警告是否会为 const 情况创建临时文件,或者出现编译错误? @janou195,见bug 912 @ggael,我认为我混淆了两件事,临时的创建和 Ref 创建的成本,但我仍然对这两件事感到困惑。很抱歉,但我不明白错误 912 在这种情况下会创建一个临时的......此外,我也不明白在这种情况下创建 Ref 是否便宜...... “传递的对象不兼容”是什么意思?您能否具体说明在哪些情况下这很便宜?在“不便宜”的情况下,成本是多少?非常感谢您的帮助!

以上是关于正确使用 Eigen::Ref<> 类的主要内容,如果未能解决你的问题,请参考以下文章

如何创建Eigen :: Ref的向量

如何创建 Eigen::Ref 的向量

传递指针中的 Eigen::Ref

如何导入具有正确类型的 Vue 类组件?

从向量中正确删除指向类的指针

XSLT:如何在 html 结果中正确应用 css 类