在 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/