2017-04-14 48 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