mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-01-18 14:34:17 +08:00
* 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:
parent
aae5994b9e
commit
75da254fc3
@ -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.
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user