aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2010-06-28 00:42:57 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2010-06-28 00:42:57 +0200
commit75da254fc3f70d5bc5c377ee78b0354ab369dec7 (patch)
treefe7e743a097a48a832a210008be18c9156d68c1f
parentaae5994b9e012175ad9d66b1165999e8fa89b360 (diff)
* use transpose() instead of row vectors (more common use case)
* add a word about noalias and performance for BLAS users
-rw-r--r--doc/C02_TutorialMatrixArithmetic.dox6
-rw-r--r--doc/examples/tut_arithmetic_dot_cross.cpp7
-rw-r--r--doc/examples/tut_arithmetic_matrix_mul.cpp12
3 files changed, 17 insertions, 8 deletions
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 <tt>c.noalias() -= 2 * a.adjoint() * b;</tt> 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 <Eigen/Dense>
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;
}