* 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;
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.

View File

@ -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;
}

View File

@ -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;
}