mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-20 08:39:37 +08:00

* add some explanations in the typedefs page * expand a bit the new QuickStartGuide. Some placeholders (not a pb since it's not even yet linked to from other pages). The point I want to make is that it's super important to have fully compilable short programs (even with compile instructions for the first one) not just small snippets, at least at the beginning. Let's start with examples of compilable programs.
156 lines
5.4 KiB
Plaintext
156 lines
5.4 KiB
Plaintext
namespace Eigen {
|
|
|
|
/** \page QuickStartGuide
|
|
|
|
<h1>Quick start guide</h1>
|
|
|
|
<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>
|
|
|
|
For instance \code Matrix3f m = Matrix3f::Identity(); \endcode creates a 3x3 fixed size matrix of float
|
|
which is initialized to the identity matrix.
|
|
Similarly \code MatrixXcd m = MatrixXcd::Zero(rows,cols); \endcode creates a rows x cols matrix
|
|
of double precision complex which is initialized to zero. Here rows and cols do not have to be
|
|
known at compile-time. In "MatrixXcd", "X" stands for dynamic, "c" for complex, and "d" for double.
|
|
|
|
You can also initialize a matrix with all coefficients equal to one:
|
|
\code MatrixXi m = MatrixXi::Ones(rows,cols); \endcode
|
|
or to any constant value:
|
|
\code
|
|
MatrixXi m = MatrixXi::Constant(rows,cols,66);
|
|
Matrix4d m = Matrix4d::Constant(6.6);
|
|
\endcode
|
|
|
|
All these 4 matrix creation functions also exist with the "set" prefix:
|
|
\code
|
|
Matrix3f m3; MatrixXi mx; VectorXcf vec;
|
|
m3.setZero(); mx.setZero(rows,cols); vec.setZero(size);
|
|
m3.setIdentity(); mx.setIdentity(rows,cols); vec.setIdentity(size);
|
|
m3.setOnes(); mx.setOnes(rows,cols); vec.setOnes(size);
|
|
m3.setConstant(6.6); mx.setConstant(rows,cols,6.6); vec.setConstant(size,complex<float>(6,3));
|
|
\endcode
|
|
|
|
Finally, all the coefficients of a matrix can set using the comma initializer syntax:
|
|
<table><tr><td>
|
|
\include Tutorial_commainit_01.cpp
|
|
</td>
|
|
<td>
|
|
output:
|
|
\verbinclude Tutorial_commainit_01.out
|
|
</td></tr></table>
|
|
|
|
Eigen's comma initializer also allows to set the matrix per block making it much more powerful:
|
|
<table><tr><td>
|
|
\include Tutorial_commainit_02.cpp
|
|
</td>
|
|
<td>
|
|
output with rows=cols=5:
|
|
\verbinclude Tutorial_commainit_02.out
|
|
</td></tr></table>
|
|
|
|
<h2>Basic Linear Algebra</h2>
|
|
|
|
As long as you use mathematically well defined operators, you can basically write your matrix
|
|
and vector expressions using standard arithmetic operators:
|
|
\code
|
|
mat1 = mat1*1.5 + mat2 * mat3/4;
|
|
\endcode
|
|
|
|
\b dot \b product (inner product):
|
|
\code
|
|
scalar = vec1.dot(vec2);
|
|
\endcode
|
|
|
|
\b outer \b product:
|
|
\code
|
|
mat = vec1 * vec2.transpose();
|
|
\endcode
|
|
|
|
\b cross \b product: The cross product is defined in the Geometry module, you therefore have to include it first:
|
|
\code
|
|
#include <Eigen/Geometry>
|
|
vec3 = vec1.cross(vec2);
|
|
\endcode
|
|
|
|
|
|
By default, Eigen's only allows mathematically well defined operators.
|
|
However, thanks to the .cwise() operator prefix, Eigen's matrices also provide
|
|
a very powerful numerical container supporting most common coefficient wise operators:
|
|
* Coefficient wise product: \code mat3 = mat1.cwise() * mat2; \endcode
|
|
* Coefficient wise division: \code mat3 = mat1.cwise() / mat2; \endcode
|
|
* Coefficient wise reciprocal: \code mat3 = mat1.cwise().inverse(); \endcode
|
|
* Add a scalar to a matrix: \code mat3 = mat1.cwise() + scalar; \endcode
|
|
* Coefficient wise comparison: \code mat3 = mat1.cwise() < mat2; \endcode
|
|
* Finally, \c .cwise() offers many common numerical functions including abs, pow, exp, sin, cos, tan, e.g.:
|
|
\code mat3 = mat1.cwise().sin(); \endcode
|
|
|
|
<h2>Reductions</h2>
|
|
|
|
\code
|
|
scalar = mat.sum(); scalar = mat.norm(); scalar = mat.minCoeff();
|
|
vec = mat.colwise().sum(); vec = mat.colwise().norm(); vec = mat.colwise().minCoeff();
|
|
vec = mat.rowwise().sum(); vec = mat.rowwise().norm(); vec = mat.rowwise().minCoeff();
|
|
\endcode
|
|
Other natively supported reduction operations include maxCoeff(), norm2(), all() and any().
|
|
|
|
|
|
<h2>Sub matrices</h2>
|
|
|
|
|
|
|
|
<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>
|
|
|
|
*/
|
|
|
|
}
|