Rev | Line | |
---|
[136] | 1 | namespace Eigen {
|
---|
| 2 |
|
---|
| 3 | /** \page TopicPitfalls Common pitfalls
|
---|
| 4 |
|
---|
| 5 | \section TopicPitfalls_template_keyword Compilation error with template methods
|
---|
| 6 |
|
---|
| 7 | See this \link TopicTemplateKeyword page \endlink.
|
---|
| 8 |
|
---|
| 9 | \section TopicPitfalls_auto_keyword C++11 and the auto keyword
|
---|
| 10 |
|
---|
| 11 | In short: do not use the auto keywords with Eigen's expressions, unless you are 100% sure about what you are doing. In particular, do not use the auto keyword as a replacement for a Matrix<> type. Here is an example:
|
---|
| 12 |
|
---|
| 13 | \code
|
---|
| 14 | MatrixXd A, B;
|
---|
| 15 | auto C = A*B;
|
---|
| 16 | for(...) { ... w = C * v; ...}
|
---|
| 17 | \endcode
|
---|
| 18 |
|
---|
| 19 | In this example, the type of C is not a MatrixXd but an abstract expression representing a matrix product and storing references to A and B. Therefore, the product of A*B will be carried out multiple times, once per iteration of the for loop. Moreover, if the coefficients of A or B change during the iteration, then C will evaluate to different values.
|
---|
| 20 |
|
---|
| 21 | Here is another example leading to a segfault:
|
---|
| 22 | \code
|
---|
| 23 | auto C = ((A+B).eval()).transpose();
|
---|
| 24 | // do something with C
|
---|
| 25 | \endcode
|
---|
| 26 | The problem is that eval() returns a temporary object (in this case a MatrixXd) which is then referenced by the Transpose<> expression. However, this temporary is deleted right after the first line, and there the C expression reference a dead object. The same issue might occur when sub expressions are automatically evaluated by Eigen as in the following example:
|
---|
| 27 | \code
|
---|
| 28 | VectorXd u, v;
|
---|
| 29 | auto C = u + (A*v).normalized();
|
---|
| 30 | // do something with C
|
---|
| 31 | \endcode
|
---|
| 32 | where the normalized() method has to evaluate the expensive product A*v to avoid evaluating it twice. On the other hand, the following example is perfectly fine:
|
---|
| 33 | \code
|
---|
| 34 | auto C = (u + (A*v).normalized()).eval();
|
---|
| 35 | \endcode
|
---|
| 36 | In this case, C will be a regular VectorXd object.
|
---|
| 37 | */
|
---|
| 38 | }
|
---|
Note:
See
TracBrowser
for help on using the repository browser.