c++ - 具有中间变量的 Eigen 惰性评估

标签 c++ lazy-evaluation eigen

在 Eigen 文档中,我找不到对表达式进行惰性求值的确切情况的解释。就我而言,我只对系数表达式感兴趣(即不可能出现混叠)。

例如,给定 ArrayXXf a(10000, 10000);

a = a.cube() * a.cube();

在 ~250 毫秒内为我评估,与

auto aCube = a.cube();
a = aCube * aCube;

鉴于

ArrayXXf aCube = a.cube();
a = aCube * aCube;

评估大约需要 550 毫秒。

将表达式分配给显式数组类型(例如 ArrayXXf)是否总是强制对其求值?

代码是用 MinGW release -O3 编译的。

这是一个一般性问题;这个例子只是虚构的。

最佳答案

通常,如果您将表达式分配给 Array<...>,则可以它得到显式评估(除非编译器认为它可以完全优化该变量 - 可能是这种情况,特别是对于小型固定大小的数组。

分配给 auto变量不进行评估(除非您的表达式以 (...).eval() 结尾),这也意味着 aCube * aCube将评估 aCube 的每个系数两次(尽管编译器可能足够聪明,可以弄清楚它可以重用该值)。在那种特殊情况下,写成 a = aCube.square(); 可能会更好。

关于c++ - 具有中间变量的 Eigen 惰性评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43417173/

相关文章:

c++ - Gradle C( native )任务输出文件/文件(用于其他任务/项目)

c++ - 如何在成员初始值设定项列表之外初始化类成员

recursion - Clojure 中的递归惰性序列

haskell - haskell 中列表的强制严格性

c++ - 如何解决复杂的线性系统?

c# - 从 C#(64 位)加载 C++ 类库

c++ - 自定义类集的重载提取运算符

clojure - 在累加器上进行归约和映射会产生堆栈溢出

c++ - Matlab 语法帮助。'*

c++ - 特征中的 typedef 与类中的 typedef