Fixed-size matrix or vector |
Dynamic-size matrix |
Dynamic-size vector |
\code
Matrix3f x;
x = Matrix3f::Zero();
x = Matrix3f::Ones();
x = Matrix3f::Constant(value);
x = Matrix3f::Identity();
x = Matrix3f::Random();
x.setZero();
x.setOnes();
x.setIdentity();
x.setConstant(value);
x.setRandom();
\endcode
|
\code
MatrixXf x;
x = MatrixXf::Zero(rows, cols);
x = MatrixXf::Ones(rows, cols);
x = MatrixXf::Constant(rows, cols, value);
x = MatrixXf::Identity(rows, cols);
x = MatrixXf::Random(rows, cols);
x.setZero(rows, cols);
x.setOnes(rows, cols);
x.setConstant(rows, cols, value);
x.setIdentity(rows, cols);
x.setRandom(rows, cols);
\endcode
|
\code
VectorXf x;
x = VectorXf::Zero(size);
x = VectorXf::Ones(size);
x = VectorXf::Constant(size, value);
x = VectorXf::Identity(size);
x = VectorXf::Random(size);
x.setZero(size);
x.setOnes(size);
x.setConstant(size, value);
x.setIdentity(size);
x.setRandom(size);
\endcode
|
Basis vectors \link MatrixBase::Unit [details]\endlink |
\code
Vector3f::UnixX() // 1 0 0
Vector3f::UnixY() // 0 1 0
Vector3f::UnixZ() // 0 0 1
\endcode | | \code
VectorXf::Unit(size,i)
VectorXf::Unit(4,1) == Vector4f(0,1,0,0)
== Vector4f::UnitY()
\endcode
|
Here is an usage example:
matrix/vector product | \code
col2 = mat1 * col1;
row2 = row1 * mat1; row1 *= mat1;
mat3 = mat1 * mat2; mat3 *= mat1; \endcode
|
add/subtract | \code
mat3 = mat1 + mat2; mat3 += mat1;
mat3 = mat1 - mat2; mat3 -= mat1;\endcode
|
scalar product | \code
mat3 = mat1 * s1; mat3 = s1 * mat1; mat3 *= s1;
mat3 = mat1 / s1; mat3 /= s1;\endcode
|
\link MatrixBase::dot() dot product \endlink (inner product) | \code
scalar = vec1.dot(vec2);\endcode
|
outer product | \code
mat = vec1 * vec2.transpose();\endcode
|
\link MatrixBase::cross() cross product \endlink | \code
#include
vec3 = vec1.cross(vec2);\endcode |
In Eigen only mathematically well defined operators can be used right away,
but don't worry, thanks to the \link Cwise .cwise() \endlink operator prefix,
Eigen's matrices also provide a very powerful numerical container supporting
most common coefficient wise operators:
Default versions |
Optimized versions when the size is known at compile time | |
\code mat1.block(i,j,rows,cols)\endcode
\link MatrixBase::block(int,int,int,int) (more) \endlink |
\code mat1.block(i,j)\endcode
\link MatrixBase::block(int,int) (more) \endlink |
the \c rows x \c cols sub-matrix starting from position (\c i,\c j) |
\code
mat1.corner(TopLeft,rows,cols)
mat1.corner(TopRight,rows,cols)
mat1.corner(BottomLeft,rows,cols)
mat1.corner(BottomRight,rows,cols)\endcode
\link MatrixBase::corner(CornerType,int,int) (more) \endlink |
\code
mat1.corner(TopLeft)
mat1.corner(TopRight)
mat1.corner(BottomLeft)
mat1.corner(BottomRight)\endcode
\link MatrixBase::corner(CornerType) (more) \endlink |
the \c rows x \c cols sub-matrix \n taken in one of the four corners |
\code
vec1 = mat1.diagonal();
mat1.diagonal() = vec1;
\endcode
\link MatrixBase::diagonal() (more) \endlink |
|
\link MatrixBase::transpose() transposition \endlink (read-write) | \code
mat3 = mat1.transpose() * mat2;
mat3.transpose() = mat1 * mat2.transpose();
\endcode
|
\link MatrixBase::adjoint() adjoint \endlink (read only)\n | \code
mat3 = mat1.adjoint() * mat2;
mat3 = mat1.conjugate().transpose() * mat2;
\endcode
|
\link MatrixBase::asDiagonal() make a diagonal matrix \endlink from a vector \n
\b Note: this product is automatically optimized ! | \code
mat3 = mat1 * vec2.asDiagonal();\endcode
|
\link MatrixBase::minor() minor \endlink (read-write) | \code
mat4x4.minor(i,j) = mat3x3;
mat3x3 = mat4x4.minor(i,j);\endcode
|
\code
m4 = m4 * m4;\endcode |
auto-evaluates so no aliasing problem (performance penalty is low) |
\code
Matrix4f other = (m4 * m4).lazy();\endcode |
forces lazy evaluation |
\code
m4 = m4 + m4;\endcode |
here Eigen goes for lazy evaluation, as with most expressions |
\code
m4 = -m4 + m4 + 5 * m4;\endcode |
same here, Eigen chooses lazy evaluation for all that. |
\code
m4 = m4 * (m4 + m4);\endcode |
here Eigen chooses to first evaluate m4 + m4 into a temporary.
indeed, here it is an optimization to cache this intermediate result. |
\code
m3 = m3 * m4.block<3,3>(1,1);\endcode |
here Eigen chooses \b not to evaluate block() into a temporary
because accessing coefficients of that block expression is not more costly than accessing
coefficients of a plain matrix. |
\code
m4 = m4 * m4.transpose();\endcode |
same here, lazy evaluation of the transpose. |
\code
m4 = m4 * m4.transpose().eval();\endcode |
forces immediate evaluation of the transpose |
*/
/** \page TutorialGeometry Tutorial 2/3 - Geometry
\ingroup Tutorial
\ref index "Overview"
| \ref TutorialCore "Core features"
| \b Geometry
| \ref TutorialAdvancedLinearAlgebra "Advanced linear algebra"
In this tutorial chapter we will shortly introduce the many possibilities offered by the \ref GeometryModule "geometry module",
namely 2D and 3D rotations and affine transformations.
\b Table \b of \b contents
- \ref TutorialGeoRotations
- \ref TutorialGeoTransformation
Rotation type | Typical initialization code | Recommended usage |
2D rotation from an angle | \code
Rotation2D rot2(angle_in_radian);\endcode | |
2D rotation matrix | \code
Matrix2f rotmat2 = Rotation2Df(angle_in_radian);\endcode | |
3D rotation as an angle + axis | \code
AngleAxis aa(angle_in_radian, Vector3f(ax,ay,az));\endcode | |
3D rotation as a quaternion | \code
Quaternion q = AngleAxis(angle_in_radian, axis);\endcode | |
3D rotation matrix | \code
Matrix3f rotmat3 = AngleAxis(angle_in_radian, axis);\endcode | |
To transform more than a single vector the prefered representations are rotation matrices,
for other usage Rotation2D and Quaternion are the representations of choice as they are
more compact, fast and stable. AngleAxis are only useful to create other rotation objects.
\subsection TutorialGeoCommonRotationAPI Common API across rotation types
To some extent, Eigen's \ref Geometry_Module "geometry module" allows you to write
generic algorithms working on both 2D and 3D rotations of any of the five above types.
The following operation are supported:
Convertion from and to any types (of same space dimension) | \code
RotType2 a = RotType1();\endcode |
Concatenation of two rotations | \code
rot3 = rot1 * rot2;\endcode |
Apply the rotation to a vector | \code
vec2 = rot1 * vec1;\endcode |
Get the inverse rotation \n (not always the most effient choice) | \code
rot2 = rot1.inverse();\endcode |
Spherical interpolation \n (Rotation2D and Quaternion only) | \code
rot3 = rot1.slerp(alpha,rot2);\endcode |
\subsection TutorialGeoEulerAngles Euler angles
| \b 3D | \b 2D |
Creation \n rot2D can also be an angle in radian | \code
Transform3f t;
t.fromPositionOrientationScale(
pos,any_3D_rotation,Vector3f(sx,sy,sz)); \endcode | \code
Transform2f t;
t.fromPositionOrientationScale(
pos,any_2D_rotation,Vector2f(sx,sy)); \endcode |
Apply the transformation to a \b point | \code
Vector3f p1, p2;
p2 = t * p1;\endcode | \code
Vector2f p1, p2;
p2 = t * p1;\endcode |
Apply the transformation to a \b vector | \code
Vector3f v1, v2;
v2 = t.linear() * v1;\endcode | \code
Vector2f v1, v2;
v2 = t.linear() * v1;\endcode |
Concatenate two transformations | \code
t3 = t1 * t2;\endcode | \code
t3 = t1 * t2;\endcode |
OpenGL compatibility | \code
glLoadMatrixf(t.data());\endcode | \code
Transform3f aux(Transform3f::Identity);
aux.linear().corner<2,2>(TopLeft) = t.linear();
aux.translation().start<2>() = t.translation();
glLoadMatrixf(aux.data());\endcode |
\b Component \b accessors |
translation part | \code
t.translation() = vec3;
vec3 = t.translation();
\endcode | \code
t.translation() = vec2;
vec2 = t.translation();
\endcode |
linear part | \code
t.linear() = mat3x3;
mat3x3 = t.linear();
\endcode | \code
t.linear() = mat2x2;
mat2x2 = t.linear();
\endcode |
\b Editing \b shortcuts |
Applies a translation | \code
t.translate(Vector3f(tx, ty, tz));
t.pretranslate(Vector3f(tx, ty, tz));
\endcode | \code
t.translate(Vector2f(tx, ty));
t.pretranslate(Vector2f(tx, ty));
\endcode |
Applies a rotation \n rot2D can also be an angle in radian | \code
t.rotate(rot3D);
t.prerotate(rot3D);
\endcode | \code
t.rotate(rot2D);
t.prerotate(rot2D);
\endcode |
Applies a scaling | \code
t.scale(Vector3f(sx, sy, sz));
t.scale(Vector3f::Constant(s));
t.prescale(Vector3f(sx, sy, sz));
\endcode | \code
t.scale(Vector2f(tx, ty));
t.scale(Vector2f::Constant(s));
t.prescale(Vector2f(tx, ty));
\endcode |
Applies a shear transformation \n(2D only) | | \code
t.shear(sx,sy);
t.preshear(sx,sy);
\endcode |
*/
/** \page TutorialAdvancedLinearAlgebra Tutorial 3/3 - Advanced linear algebra
\ingroup Tutorial
\ref index "Overview"
| \ref TutorialCore "Core features"
| \ref TutorialGeometry "Geometry"
| \b Advanced \b linear \b algebra
\b Table \b of \b contents
- \ref TutorialAdvLinearSolvers
- \ref TutorialAdvLU
- \ref TutorialAdvCholesky
- \ref TutorialAdvQR
- \ref TutorialAdvEigenProblems
\section TutorialAdvLinearSolvers Solving linear problems
todo