* use transpose() instead of row vectors (more common use case)

* add a word about noalias and performance for BLAS users
This commit is contained in:
Gael Guennebaud 2010-06-28 00:42:57 +02:00
parent aae5994b9e
commit 75da254fc3
3 changed files with 17 additions and 8 deletions

View File

@ -124,8 +124,14 @@ introducing a temporary here, so it will compile \c m=m*m as:
tmp = m*m; tmp = m*m;
m = tmp; m = tmp;
\endcode \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". 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 \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. The above-discussed \c operator* does not allow to compute dot and cross products. For that, you need the dot() and cross() methods.

View File

@ -2,11 +2,14 @@
#include <Eigen/Dense> #include <Eigen/Dense>
using namespace Eigen; using namespace Eigen;
using namespace std;
int main() int main()
{ {
Vector3d v(1,2,3); Vector3d v(1,2,3);
Vector3d w(0,1,2); Vector3d w(0,1,2);
std::cout << "Dot product: " << v.dot(w) << std::endl; cout << "Dot product: " << v.dot(w) << endl;
std::cout << "Cross product:\n" << v.cross(w) << std::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;
} }

View File

@ -7,13 +7,13 @@ int main()
Matrix2d mat; Matrix2d mat;
mat << 1, 2, mat << 1, 2,
3, 4; 3, 4;
Vector2d vec(-1,1); Vector2d u(-1,1), v(2,0);
RowVector2d rowvec(2,0);
std::cout << "Here is mat*mat:\n" << mat*mat << std::endl; 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 mat*u:\n" << mat*u << std::endl;
std::cout << "Here is rowvec*mat:\n" << rowvec*mat << std::endl; std::cout << "Here is u^T*mat:\n" << u.transpose()*mat << std::endl;
std::cout << "Here is rowvec*vec:\n" << rowvec*vec << std::endl; std::cout << "Here is u^T*v:\n" << u.transpose()*v << std::endl;
std::cout << "Here is vec*rowvec:\n" << vec*rowvec << 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; std::cout << "Let's multiply mat by itself" << std::endl;
mat = mat*mat;
std::cout << "Now mat is mat:\n" << mat << std::endl; std::cout << "Now mat is mat:\n" << mat << std::endl;
} }