2008-08-20 08:58:25 +08:00
namespace Eigen {
/** \page QuickStartGuide
<h1>Quick start guide</h1>
2008-08-20 12:34:04 +08:00
<h2>Simple example with fixed-size matrices and vectors</h2>
By fixed-size, we mean that the number of rows and columns are known at compile-time. In this case, Eigen avoids dynamic memory allocation and unroll loops. This is useful for very small sizes (typically up to 4x4).
<table><tr><td>
\include Tutorial_simple_example_fixed_size.cpp
</td>
<td>
output:
\include Tutorial_simple_example_fixed_size.out
</td></tr></table>
<h2>Simple example with dynamic-size matrices and vectors</h2>
Dynamic-size means that the number of rows and columns are not known at compile-time. In this case, they are stored as runtime variables and the arrays are dynamically allocated.
<table><tr><td>
\include Tutorial_simple_example_dynamic_size.cpp
</td>
<td>
output:
\include Tutorial_simple_example_dynamic_size.out
</td></tr></table>
<h2>Matrix and vector types</h2>
In Eigen, all kinds of dense matrices and vectors are represented by the template class Matrix. In most cases you can simply use one of the several convenient typedefs (\ref matrixtypedefs).
The template class Matrix takes a number of template parameters, but for now it is enough to understand the 3 first ones (and the others can then be left unspecified):
\code Matrix<Scalar, RowsAtCompileTime, ColsAtCompileTime> \endcode
\li \c Scalar is the scalar type, i.e. the type of the coefficients. That is, if you want a vector of floats, choose \c float here.
\li \c RowsAtCompileTime and \c ColsAtCompileTime are the number of rows and columns of the matrix as known at compile-time.
For example, \c Vector3d is a typedef for \code Matrix<double, 3, 1> \endcode.
What if the matrix has dynamic-size i.e. the number of rows or cols isn't known at compile-time? Then use the special value Eigen::Dynamic. For example, \c VectorXd is a typedef for \code Matrix<double, Dynamic, 1> \endcode.
<h2>Matrix and vector creation and initialization</h2>
2008-08-20 08:58:25 +08:00
2008-08-20 19:31:50 +08:00
To get a matrix with all coefficients equals to a given value you can use the Matrix::Constant() function, e.g.:
<table><tr><td>
\code
int rows=2, cols=3;
cout << MatrixXf::Constant(rows, cols, sqrt(2));
\endcode
</td>
<td>
output:
\code
1.41 1.41 1.41
1.41 1.41 1.41
\endcode
</td></tr></table>
To set all the coefficients of a matrix you can also use the setConstant() variant:
2008-08-20 08:58:25 +08:00
\code
2008-08-20 19:31:50 +08:00
MatrixXf m(rows, cols);
m.setConstant(rows, cols, value);
2008-08-20 08:58:25 +08:00
\endcode
2008-08-20 19:31:50 +08:00
Eigen also offers variants of these functions for vector types and fixed-size matrices or vectors, as well as similar functions to create matrices with all coefficients equal to zero or one, to create the identity matrix and matrices with random coefficients:
<table>
<tr>
<td>Fixed-size matrix or vector</td>
<td>Dynamic-size matrix</td>
<td>Dynamic-size vector</td>
</tr>
<tr>
<td>
2008-08-20 08:58:25 +08:00
\code
2008-08-20 19:31:50 +08:00
Matrix3f x;
x = Matrix3f::Zero();
x = Matrix3f::Ones();
x = Matrix3f::Constant(6);
x = Matrix3f::Identity();
x = Matrix3f::Random();
x.setZero();
x.setOnes();
x.setIdentity();
x.setConstant(6);
x.setRandom();
2008-08-20 08:58:25 +08:00
\endcode
2008-08-20 19:31:50 +08:00
</td>
<td>
\code
MatrixXf x;
x = MatrixXf::Zero(rows, cols);
x = MatrixXf::Ones(rows, cols);
x = MatrixXf::Constant(rows, cols, 6);
x = MatrixXf::Identity(rows, cols);
x = MatrixXf::Random(rows, cols);
x.setZero(rows, cols);
x.setOnes(rows, cols);
x.setConstant(rows, cols, 6);
x.setIdentity(rows, cols);
x.setRandom(rows, cols);
\endcode
</td>
<td>
\code
VectorXf x;
x = VectorXf::Zero(size);
x = VectorXf::Ones(size);
x = VectorXf::Constant(size, 6);
x = VectorXf::Identity(size);
x = VectorXf::Random(size);
x.setZero(size);
x.setOnes(size);
x.setConstant(size, 6);
x.setIdentity(size);
x.setRandom(size);
\endcode
</td>
</tr>
</table>
2008-08-20 08:58:25 +08:00
2008-08-20 19:31:50 +08:00
Finally, all the coefficients of a matrix can be set to specific values using the comma initializer syntax:
2008-08-20 08:58:25 +08:00
<table><tr><td>
\include Tutorial_commainit_01.cpp
</td>
<td>
output:
\verbinclude Tutorial_commainit_01.out
</td></tr></table>
2008-08-20 19:31:50 +08:00
Eigen's comma initializer also allows you to set the matrix per block:
2008-08-20 08:58:25 +08:00
<table><tr><td>
\include Tutorial_commainit_02.cpp
</td>
<td>
2008-08-20 19:31:50 +08:00
output:
2008-08-20 08:58:25 +08:00
\verbinclude Tutorial_commainit_02.out
</td></tr></table>
2008-08-20 19:31:50 +08:00
Here .finished() is used to get the actual matrix object once the comma initialization
of our temporary submatrix is done. Note that despite the appearant complexity of such an expression
Eigen's comma initializer usually yields to very optimized code without any overhead.
2008-08-20 08:58:25 +08:00
<h2>Basic Linear Algebra</h2>
2008-08-21 07:04:58 +08:00
In short all mathematically well defined operators can be used right away as in the following example:
2008-08-20 08:58:25 +08:00
\code
2008-08-20 21:07:46 +08:00
mat4 -= mat1*1.5 + mat2 * mat3/4;
2008-08-20 08:58:25 +08:00
\endcode
2008-08-20 21:07:46 +08:00
which includes two matrix scalar products ("mat1*1.5" and "mat3/4"), a matrix-matrix product ("mat2 * mat3/4"),
a matrix addition ("+") and substraction with assignment ("-=").
2008-08-20 08:58:25 +08:00
2008-08-20 21:07:46 +08:00
<table>
<tr><td>
matrix/vector product</td><td>\code
col2 = mat1 * col1;
row2 = row1 * mat1; row1 *= mat1;
mat3 = mat1 * mat2; mat3 *= mat1; \endcode
</td></tr>
<tr><td>
add/subtract</td><td>\code
mat3 = mat1 + mat2; mat3 += mat1;
mat3 = mat1 - mat2; mat3 -= mat1;\endcode
</td></tr>
<tr><td>
scalar product</td><td>\code
mat3 = mat1 * s1; mat3 = s1 * mat1; mat3 *= s1;
mat3 = mat1 / s1; mat3 /= s1;\endcode
</td></tr>
<tr><td>
2008-08-21 07:04:58 +08:00
\link MatrixBase::dot() dot product \endlink (inner product)</td><td>\code
2008-08-20 21:07:46 +08:00
scalar = vec1.dot(vec2);\endcode
</td></tr>
<tr><td>
outer product</td><td>\code
mat = vec1 * vec2.transpose();\endcode
</td></tr>
<tr><td>
2008-08-21 07:04:58 +08:00
\link MatrixBase::cross() cross product \endcode</td><td>\code
2008-08-20 08:58:25 +08:00
#include <Eigen/Geometry>
2008-08-20 21:07:46 +08:00
vec3 = vec1.cross(vec2);\endcode</td></tr>
</table>
2008-08-20 08:58:25 +08:00
2008-08-20 21:07:46 +08:00
In Eigen only mathematically well defined operators can be used right away,
2008-08-21 07:04:58 +08:00
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:
2008-08-20 19:31:50 +08:00
<table>
2008-08-20 21:07:46 +08:00
<tr><td>Coefficient wise product</td>
<td>\code mat3 = mat1.cwise() * mat2; \endcode
</td></tr>
<tr><td>
Add a scalar to all coefficients</td><td>\code
mat3 = mat1.cwise() + scalar;
mat3.cwise() += scalar;
mat3.cwise() -= scalar;
\endcode
</td></tr>
<tr><td>
Coefficient wise division</td><td>\code
mat3 = mat1.cwise() / mat2; \endcode
</td></tr>
<tr><td>
Coefficient wise reciprocal</td><td>\code
mat3 = mat1.cwise().inverse(); \endcode
</td></tr>
<tr><td>
Coefficient wise comparisons \n
(support all operators)</td><td>\code
mat3 = mat1.cwise() < mat2;
mat3 = mat1.cwise() <= mat2;
mat3 = mat1.cwise() > mat2;
etc.
\endcode
</td></tr>
<tr><td>
Trigo:\n sin, cos, tan</td><td>\code
mat3 = mat1.cwise().sin();
etc.
\endcode
</td></tr>
<tr><td>
Power:\n pow, square, cube, sqrt, exp, log</td><td>\code
mat3 = mat1.cwise().square();
mat3 = mat1.cwise().pow(5);
mat3 = mat1.cwise().log();
etc.
\endcode
</td></tr>
<tr><td>
min, max, absolute value</td><td>\code
mat3 = mat1.cwise().min(mat2);
mat3 = mat1.cwise().max(mat2);
mat3 = mat1.cwise().abs(mat2);
mat3 = mat1.cwise().abs2(mat2);
\endcode</td></tr>
2008-08-20 19:31:50 +08:00
</table>
2008-08-20 08:58:25 +08:00
<h2>Reductions</h2>
2008-08-21 07:04:58 +08:00
Reductions can be done matrix-wise,
\link MatrixBase::colwise() column-wise \endlink or
\link MatrixBase::rowwise() row-wise \endlink, e.g.:
2008-08-20 21:07:46 +08:00
<table>
<tr><td>\code mat \endcode
</td><td>\code
5 3 1
2 7 8
9 4 6
2008-08-20 08:58:25 +08:00
\endcode
2008-08-20 21:07:46 +08:00
</td></tr>
<tr><td>\code mat.minCoeff(); \endcode</td><td>\code 1 \endcode</td></tr>
<tr><td>\code mat.maxCoeff(); \endcode</td><td>\code 9 \endcode</td></tr>
<tr><td>\code mat.colwise().minCoeff(); \endcode</td><td>\code 2 3 1 \endcode</td></tr>
<tr><td>\code mat.colwise().maxCoeff(); \endcode</td><td>\code 9 7 8 \endcode</td></tr>
<tr><td>\code mat.rowwise().minCoeff(); \endcode</td><td>\code
1
2
4
\endcode</td></tr>
<tr><td>\code mat.rowwise().maxCoeff(); \endcode</td><td>\code
5
8
9
\endcode</td></tr>
</table>
2008-08-20 08:58:25 +08:00
2008-08-21 07:04:58 +08:00
Eigen provides several other reduction methods such as \link Cwise::sum() sum() \endlink,
\link Cwise::norm() norm() \endlink, \link Cwise::norm2() norm2() \endlink,
\link Cwise::all() all() \endlink, and \link Cwise::any() any() \endlink.
2008-08-20 21:07:46 +08:00
The all() and any() functions are especially useful in combinaison with coeff-wise comparison operators.
2008-08-20 08:58:25 +08:00
2008-08-21 07:04:58 +08:00
2008-08-20 08:58:25 +08:00
<h2>Sub matrices</h2>
2008-08-21 07:04:58 +08:00
Read-write access to a \link MatrixBase::col(int) column \endlink
or a \link MatrixBase::row(int) row \endlink of a matrix:
\code
mat1.row(i) = mat2.col(j);
mat1.col(j1).swap(mat1.col(j2));
\endcode
Read-write access to sub-vector:
<table>
<tr>
<td>Default versions</td>
<td>Optimized versions when the size is known at compile time</td></tr>
<td></td>
<tr><td>\code vec1.start(n)\endcode</td><td>\code vec1.start<n>()\endcode</td><td>the first \c n coeffs </td></tr>
<tr><td>\code vec1.end(n)\endcode</td><td>\code vec1.end<n>()\endcode</td><td>the last \c n coeffs </td></tr>
<tr><td>\code vec1.block(pos,n)\endcode</td><td>\code vec1.block<n>(pos)\endcode</td>
<td>the \c size coeffs in the range [\c pos : \c pos + \c n [</td></tr>
</table>
Read-write access to sub-matrices:
<table>
<tr><td>Default versions</td>
<td>Optimized versions when the size is known at compile time</td><td></td></tr>
<tr>
<td>\code mat1.block(i,j,rows,cols)\endcode
\link MatrixBase::block(int,int,int,int) (more) \endlink</td>
<td>\code mat1.block<rows,cols>(i,j)\endcode
\link MatrixBase::block(int,int) (more) \endlink</td>
<td>the \c rows x \c cols sub-matrix starting from position (\c i,\c j) </td>
</tr>
<tr>
<td>\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</td>
<td>\code
mat1.corner<rows,cols>(TopLeft)
mat1.corner<rows,cols>(TopRight)
mat1.corner<rows,cols>(BottomLeft)
mat1.corner<rows,cols>(BottomRight)\endcode
\link MatrixBase::corner(CornerType) (more) \endlink</td>
<td>the \c rows x \c cols sub-matrix \n taken in one of the four corners</td></tr>
</table>
<h2>Transformations</h2>
transpose, adjoint, etc...
2008-08-20 08:58:25 +08:00
<h2>Geometry features</h2>
<h2>Notes on performances</h2>
<h2>Advanced Linear Algebra</h2>
<h3>Solving linear problems</h3>
<h3>LU</h3>
<h3>Cholesky</h3>
<h3>QR</h3>
<h3>Eigen value problems</h3>
*/
}