2017-04-14 106 views
2

在特征文档中,我没有找到一个确切的说明,当一个表达式被懒评估。对我而言,只有系数式表达才是有趣的,也就是说没有混叠的可能性。Eigens惰性评估与中间变量

ArrayXXf a(10000, 10000);,然后

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

评估我在250毫秒〜PC上一样,同样

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

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

在〜550ms进行评估。

可以这样说:当一个表达式被分配给一个显式数组类型(比如ArrayXXf)时,表达式总是被计算出来吗?

该代码编译与MinGW版本-O3

p.s.这是一个普遍的问题,这个例子只是化妆

回答

2

一般来说,是的,如果你指定一个表达式到Array<...>它会得到明确的评估(除非编译器认为它可以完全优化掉那个变量 - 可能是这样的,尤其是对于小的固定尺寸的阵列。

分配到一个auto变量确实没有评估(除非你的表达与(...).eval()结束),这也意味着,aCube * aCube将评估aCube每个coeffient两次(虽然编译器可能足够聪明来弄清楚它可以重新使用这个值)在这种特殊情况下,最好写a = aCube.square();

+0

这是否也算矩阵?然后,你需要像'matrix1.noalias()= matrix2 * matrix2;'记录[这里](https://eigen.tuxfamily.org/dox/TopicLazyEvaluation.html)这样的外文文档中的noalias() – yar

+1

因为当时'matrix2 * matrix2'被分配给'matrix1',它会被评估(除非你写'auto matrix1 = ...;')。对于矩阵产品,Eigen不能确定没有别名,因此默认情况下它会评估为临时值。 – chtz

+0

明白了,谢谢! – yar