mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-12 19:20:36 +08:00
bug #1144: clarify the doc about aliasing in case of resizing and matrix product.
This commit is contained in:
parent
b114e6fd3b
commit
c10021c00a
@ -153,10 +153,11 @@ not necessary to evaluate the right-hand side explicitly.
|
||||
|
||||
\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, then the statement <tt>matA = matA * matA;</tt> is safe. 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.
|
||||
Matrix multiplication is the only operation in %Eigen that assumes aliasing by default, <strong>under the
|
||||
condition that the destination matrix is not resized</strong>.
|
||||
Thus, if \c matA is a \b squared matrix, then the statement <tt>matA = matA * matA;</tt> is safe.
|
||||
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">
|
||||
<tr><th>Example</th><th>Output</th></tr>
|
||||
@ -198,6 +199,27 @@ may get wrong results:
|
||||
\verbinclude TopicAliasing_mult3.out
|
||||
</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
|
||||
|
||||
|
5
doc/snippets/TopicAliasing_mult4.cpp
Normal file
5
doc/snippets/TopicAliasing_mult4.cpp
Normal 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;
|
5
doc/snippets/TopicAliasing_mult5.cpp
Normal file
5
doc/snippets/TopicAliasing_mult5.cpp
Normal 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;
|
Loading…
x
Reference in New Issue
Block a user