diff --git a/doc/C02_TutorialMatrixArithmetic.dox b/doc/C02_TutorialMatrixArithmetic.dox index d45b00725..55aab961e 100644 --- a/doc/C02_TutorialMatrixArithmetic.dox +++ b/doc/C02_TutorialMatrixArithmetic.dox @@ -124,8 +124,14 @@ introducing a temporary here, so it will compile \c m=m*m as: tmp = m*m; m = tmp; \endcode +If you know your matrix product can be safely evluated into the destination matrix without aliasing issue, then you can use the \c nolias() function to avoid the temporary, e.g.: +\code +c.noalias() += a * b; +\endcode For more details on this topic, see \ref TopicEigenExpressionTemplates "this page". +\b Note: for BLAS users worried about performance, expressions such as c.noalias() -= 2 * a.adjoint() * b; are fully optimized and trigger a single gemm-like function call. + \section TutorialArithmeticDotAndCross Dot product and cross product The above-discussed \c operator* does not allow to compute dot and cross products. For that, you need the dot() and cross() methods. diff --git a/doc/examples/tut_arithmetic_dot_cross.cpp b/doc/examples/tut_arithmetic_dot_cross.cpp index 0f8e45359..631c9a5e0 100644 --- a/doc/examples/tut_arithmetic_dot_cross.cpp +++ b/doc/examples/tut_arithmetic_dot_cross.cpp @@ -2,11 +2,14 @@ #include using namespace Eigen; +using namespace std; int main() { Vector3d v(1,2,3); Vector3d w(0,1,2); - std::cout << "Dot product: " << v.dot(w) << std::endl; - std::cout << "Cross product:\n" << v.cross(w) << std::endl; + cout << "Dot product: " << v.dot(w) << endl; + double dp = v.adjoint()*w; // automatic conversion of the inner product to a scalar + cout << "Dot product via a matrix product: " << dp << endl; + cout << "Cross product:\n" << v.cross(w) << endl; } diff --git a/doc/examples/tut_arithmetic_matrix_mul.cpp b/doc/examples/tut_arithmetic_matrix_mul.cpp index 63be38241..f21390241 100644 --- a/doc/examples/tut_arithmetic_matrix_mul.cpp +++ b/doc/examples/tut_arithmetic_matrix_mul.cpp @@ -7,13 +7,13 @@ int main() Matrix2d mat; mat << 1, 2, 3, 4; - Vector2d vec(-1,1); - RowVector2d rowvec(2,0); + Vector2d u(-1,1), v(2,0); std::cout << "Here is mat*mat:\n" << mat*mat << std::endl; - std::cout << "Here is mat*vec:\n" << mat*vec << std::endl; - std::cout << "Here is rowvec*mat:\n" << rowvec*mat << std::endl; - std::cout << "Here is rowvec*vec:\n" << rowvec*vec << std::endl; - std::cout << "Here is vec*rowvec:\n" << vec*rowvec << std::endl; + std::cout << "Here is mat*u:\n" << mat*u << std::endl; + std::cout << "Here is u^T*mat:\n" << u.transpose()*mat << std::endl; + std::cout << "Here is u^T*v:\n" << u.transpose()*v << std::endl; + std::cout << "Here is u*v^T:\n" << u*v.transpose() << std::endl; std::cout << "Let's multiply mat by itself" << std::endl; + mat = mat*mat; std::cout << "Now mat is mat:\n" << mat << std::endl; }