2017-04-14 13 views
2

Eigenのドキュメントでは、式が遅延評価されている場合、正確な解明は見つかりませんでした。私にとって、係数的な表現だけが興味深い、すなわちエイリアシングの可能性はない。中間変数を使用したEugensの遅延評価

Takeなど。 ArrayXXf a(10000, 10000);は、その後、

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

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

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

一方は〜550msで評価されたのと同じ、〜250msの中に私のPC上で評価します。

式が明示的なArray型(ArrayXXfなど)に割り当てられている場合、式は常に評価されますか?

コードはMinGWリリースでコンパイルされました-O3

p.s.

答えて

2

通常、式をArray<...>に代入すると、式が明示的に評価されます(ただし、コンパイラが変数を完全に最適化できると判断しない限り)。 (あなたの式は(...).eval()で終わっていない限り)、auto変数に代入特に小さな固定サイズの配列のために。

、それはまた、コンパイラがするのに十分な可能性がスマートですがaCube * aCubeが(2回aCubeの各coeffientを評価することを意味全く評価しませんその値を再利用できることを理解してください)。その特定のケースでは、おそらく書く方が良いでしょう。a = aCube.square();

+0

これは行列の数もカウントしますか? 'matrix1.noalias()= matrix2 * matrix2;'のようなcontxtにnoalias()が必要なのは何ですか?(here:https://eigen.tuxfamily.org/dox/TopicLazyEvaluation.html) – yar

+1

'matrix2 * matrix2'が' matrix1'に割り当てられているので、 'auto matrix1 = ...;'と書かなければ評価されます。また、マトリックス製品では、エイジングはエイリアシングがないことを確認できないため、デフォルトでは一時的に評価されます。 – chtz

+0

、ありがとう! – yar

関連する問題