bug #1144: clarify the doc about aliasing in case of resizing and matrix product.

This commit is contained in:
Gael Guennebaud 2016-01-25 15:50:55 +01:00
parent b114e6fd3b
commit c10021c00a
3 changed files with 36 additions and 4 deletions

View File

@ -153,10 +153,11 @@ not necessary to evaluate the right-hand side explicitly.
\section TopicAliasingMatrixMult Aliasing and matrix multiplication \section TopicAliasingMatrixMult Aliasing and matrix multiplication
Matrix multiplication is the only operation in %Eigen that assumes aliasing by default. Thus, if \c matA is a Matrix multiplication is the only operation in %Eigen that assumes aliasing by default, <strong>under the
matrix, then the statement <tt>matA = matA * matA;</tt> is safe. All other operations in %Eigen assume that condition that the destination matrix is not resized</strong>.
there are no aliasing problems, either because the result is assigned to a different matrix or because it is a Thus, if \c matA is a \b squared matrix, then the statement <tt>matA = matA * matA;</tt> is safe.
component-wise operation. All other operations in %Eigen assume that there are no aliasing problems,
either because the result is assigned to a different matrix or because it is a component-wise operation.
<table class="example"> <table class="example">
<tr><th>Example</th><th>Output</th></tr> <tr><th>Example</th><th>Output</th></tr>
@ -198,6 +199,27 @@ may get wrong results:
\verbinclude TopicAliasing_mult3.out \verbinclude TopicAliasing_mult3.out
</td></tr></table> </td></tr></table>
Moreover, starting in Eigen 3.3, aliasing is \b not assumed if the destination matrix is resized and the product is not directly assigned to the destination.
Therefore, the following example is also wrong:
<table class="example">
<tr><th>Example</th><th>Output</th></tr>
<tr><td>
\include TopicAliasing_mult4.cpp
</td>
<td>
\verbinclude TopicAliasing_mult4.out
</td></tr></table>
As for any aliasing issue, you can resolve it by explicitly evaluating the expression prior to assignment:
<table class="example">
<tr><th>Example</th><th>Output</th></tr>
<tr><td>
\include TopicAliasing_mult5.cpp
</td>
<td>
\verbinclude TopicAliasing_mult5.out
</td></tr></table>
\section TopicAliasingSummary Summary \section TopicAliasingSummary Summary

View File

@ -0,0 +1,5 @@
MatrixXf A(2,2), B(3,2);
B << 2, 0, 0, 3, 1, 1;
A << 2, 0, 0, -2;
A = (B * A).cwiseAbs();
cout << A;

View File

@ -0,0 +1,5 @@
MatrixXf A(2,2), B(3,2);
B << 2, 0, 0, 3, 1, 1;
A << 2, 0, 0, -2;
A = (B * A).eval().cwiseAbs();
cout << A;