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.
これは行列の数もカウントしますか? 'matrix1.noalias()= matrix2 * matrix2;'のようなcontxtにnoalias()が必要なのは何ですか?(here:https://eigen.tuxfamily.org/dox/TopicLazyEvaluation.html) – yar
'matrix2 * matrix2'が' matrix1'に割り当てられているので、 'auto matrix1 = ...;'と書かなければ評価されます。また、マトリックス製品では、エイジングはエイリアシングがないことを確認できないため、デフォルトでは一時的に評価されます。 – chtz
、ありがとう! – yar