blob: 3e0785a1f580128d05fb2f3b5e6c39e0e676fe66 [file] [log] [blame]
Benoit Jacob43388342010-06-25 10:04:35 -04001namespace Eigen {
2
Gael Guennebaud93ee82b2013-01-05 16:37:11 +01003/** \eigenManualPage TutorialMatrixClass The Matrix class
Benoit Jacob43388342010-06-25 10:04:35 -04004
Gael Guennebaud93ee82b2013-01-05 16:37:11 +01005\eigenAutoToc
Benoit Jacobe078bb22010-06-26 14:00:00 -04006
Jitse Niesen3428d802010-07-06 10:48:25 +01007In Eigen, all matrices and vectors are objects of the Matrix template class.
Benoit Jacob43388342010-06-25 10:04:35 -04008Vectors are just a special case of matrices, with either 1 row or 1 column.
9
Jitse Niesen3428d802010-07-06 10:48:25 +010010\section TutorialMatrixFirst3Params The first three template parameters of Matrix
Benoit Jacob43388342010-06-25 10:04:35 -040011
Jitse Niesen3428d802010-07-06 10:48:25 +010012The Matrix class takes six template parameters, but for now it's enough to
13learn about the first three first parameters. The three remaining parameters have default
Benoit Jacob43388342010-06-25 10:04:35 -040014values, which for now we will leave untouched, and which we
Benoit Jacobe078bb22010-06-26 14:00:00 -040015\ref TutorialMatrixOptTemplParams "discuss below".
Benoit Jacob43388342010-06-25 10:04:35 -040016
Jitse Niesen3428d802010-07-06 10:48:25 +010017The three mandatory template parameters of Matrix are:
Benoit Jacob43388342010-06-25 10:04:35 -040018\code
19Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>
20\endcode
21\li \c Scalar is the scalar type, i.e. the type of the coefficients.
22 That is, if you want a matrix of floats, choose \c float here.
Benoit Jacobe078bb22010-06-26 14:00:00 -040023 See \ref TopicScalarTypes "Scalar types" for a list of all supported
Benoit Jacob43388342010-06-25 10:04:35 -040024 scalar types and for how to extend support to new types.
25\li \c RowsAtCompileTime and \c ColsAtCompileTime are the number of rows
Jitse Niesen3428d802010-07-06 10:48:25 +010026 and columns of the matrix as known at compile time (see
27 \ref TutorialMatrixDynamic "below" for what to do if the number is not
28 known at compile time).
Benoit Jacob43388342010-06-25 10:04:35 -040029
30We offer a lot of convenience typedefs to cover the usual cases. For example, \c Matrix4f is
31a 4x4 matrix of floats. Here is how it is defined by Eigen:
32\code
Jitse Niesen3428d802010-07-06 10:48:25 +010033typedef Matrix<float, 4, 4> Matrix4f;
Benoit Jacob43388342010-06-25 10:04:35 -040034\endcode
Benoit Jacobe078bb22010-06-26 14:00:00 -040035We discuss \ref TutorialMatrixTypedefs "below" these convenience typedefs.
Benoit Jacob43388342010-06-25 10:04:35 -040036
Benoit Jacobe078bb22010-06-26 14:00:00 -040037\section TutorialMatrixVectors Vectors
Benoit Jacob43388342010-06-25 10:04:35 -040038
39As mentioned above, in Eigen, vectors are just a special case of
40matrices, with either 1 row or 1 column. The case where they have 1 column is the most common;
41such vectors are called column-vectors, often abbreviated as just vectors. In the other case
42where they have 1 row, they are called row-vectors.
43
Jitse Niesen3428d802010-07-06 10:48:25 +010044For example, the convenience typedef \c Vector3f is a (column) vector of 3 floats. It is defined as follows by Eigen:
Benoit Jacob43388342010-06-25 10:04:35 -040045\code
46typedef Matrix<float, 3, 1> Vector3f;
47\endcode
Jitse Niesen3428d802010-07-06 10:48:25 +010048We also offer convenience typedefs for row-vectors, for example:
Benoit Jacob43388342010-06-25 10:04:35 -040049\code
50typedef Matrix<int, 1, 2> RowVector2i;
51\endcode
52
Benoit Jacobe078bb22010-06-26 14:00:00 -040053\section TutorialMatrixDynamic The special value Dynamic
Benoit Jacob43388342010-06-25 10:04:35 -040054
55Of course, Eigen is not limited to matrices whose dimensions are known at compile time.
Jitse Niesen3428d802010-07-06 10:48:25 +010056The \c RowsAtCompileTime and \c ColsAtCompileTime template parameters can take the special
Benoit Jacob43388342010-06-25 10:04:35 -040057value \c Dynamic which indicates that the size is unknown at compile time, so must
Jitse Niesen3428d802010-07-06 10:48:25 +010058be handled as a run-time variable. In Eigen terminology, such a size is referred to as a
Benoit Jacob43388342010-06-25 10:04:35 -040059\em dynamic \em size; while a size that is known at compile time is called a
60\em fixed \em size. For example, the convenience typedef \c MatrixXd, meaning
61a matrix of doubles with dynamic size, is defined as follows:
62\code
Jitse Niesen3428d802010-07-06 10:48:25 +010063typedef Matrix<double, Dynamic, Dynamic> MatrixXd;
Benoit Jacob43388342010-06-25 10:04:35 -040064\endcode
65And similarly, we define a self-explanatory typedef \c VectorXi as follows:
66\code
Jitse Niesen3428d802010-07-06 10:48:25 +010067typedef Matrix<int, Dynamic, 1> VectorXi;
Benoit Jacob43388342010-06-25 10:04:35 -040068\endcode
69You can perfectly have e.g. a fixed number of rows with a dynamic number of columns, as in:
70\code
71Matrix<float, 3, Dynamic>
72\endcode
73
Benoit Jacobe078bb22010-06-26 14:00:00 -040074\section TutorialMatrixConstructors Constructors
Benoit Jacob43388342010-06-25 10:04:35 -040075
Benoit Jacob26129222010-10-15 09:44:43 -040076A default constructor is always available, never performs any dynamic memory allocation, and never initializes the matrix coefficients. You can do:
Benoit Jacob43388342010-06-25 10:04:35 -040077\code
78Matrix3f a;
79MatrixXf b;
80\endcode
81Here,
Jitse Niesen4e6d7462013-06-18 14:35:12 +010082\li \c a is a 3-by-3 matrix, with a plain float[9] array of uninitialized coefficients,
83\li \c b is a dynamic-size matrix whose size is currently 0-by-0, and whose array of
Benoit Jacob43388342010-06-25 10:04:35 -040084coefficients hasn't yet been allocated at all.
85
86Constructors taking sizes are also available. For matrices, the number of rows is always passed first.
87For vectors, just pass the vector size. They allocate the array of coefficients
88with the given size, but don't initialize the coefficients themselves:
89\code
90MatrixXf a(10,15);
91VectorXf b(30);
92\endcode
93Here,
94\li \c a is a 10x15 dynamic-size matrix, with allocated but currently uninitialized coefficients.
95\li \c b is a dynamic-size vector of size 30, with allocated but currently uninitialized coefficients.
96
97In order to offer a uniform API across fixed-size and dynamic-size matrices, it is legal to use these
98constructors on fixed-size matrices, even if passing the sizes is useless in this case. So this is legal:
99\code
100Matrix3f a(3,3);
101\endcode
102and is a no-operation.
103
Gael Guennebaud80f81f92019-01-22 17:08:47 +0100104Matrices and vectors can also be initialized from lists of coefficients.
105Prior to C++11, this feature is limited to small fixed-size column or vectors up to size 4:
Benoit Jacob43388342010-06-25 10:04:35 -0400106\code
107Vector2d a(5.0, 6.0);
108Vector3d b(5.0, 6.0, 7.0);
109Vector4d c(5.0, 6.0, 7.0, 8.0);
110\endcode
111
David Tellenbach237b03b2019-01-23 00:07:19 +0100112If C++11 is enabled, fixed-size column or row vectors of arbitrary size can be initialized by passing an arbitrary number of coefficients:
David Tellenbachdb152b92019-01-21 16:25:57 +0100113\code
David Tellenbach237b03b2019-01-23 00:07:19 +0100114Vector2i a(1, 2); // A column vector containing the elements {1, 2}
Gael Guennebaud80f81f92019-01-22 17:08:47 +0100115Matrix<int, 5, 1> b {1, 2, 3, 4, 5}; // A row-vector containing the elements {1, 2, 3, 4, 5}
David Tellenbach237b03b2019-01-23 00:07:19 +0100116Matrix<int, 1, 5> c = {1, 2, 3, 4, 5}; // A column vector containing the elements {1, 2, 3, 4, 5}
David Tellenbachdb152b92019-01-21 16:25:57 +0100117\endcode
118
Gael Guennebaud80f81f92019-01-22 17:08:47 +0100119In the general case of matrices and vectors with either fixed or runtime sizes,
120coefficients have to be grouped by rows and passed as an initializer list of initializer list (\link Matrix::Matrix(const std::initializer_list<std::initializer_list<Scalar>>&) details \endlink):
David Tellenbachdb152b92019-01-21 16:25:57 +0100121\code
Gael Guennebaud80f81f92019-01-22 17:08:47 +0100122MatrixXi a { // construct a 2x2 matrix
David Tellenbachdb152b92019-01-21 16:25:57 +0100123 {1, 2}, // first row
124 {3, 4} // second row
125};
126Matrix<double, 2, 3> b {
Gael Guennebaud80f81f92019-01-22 17:08:47 +0100127 {2, 3, 4},
128 {5, 6, 7},
David Tellenbachdb152b92019-01-21 16:25:57 +0100129};
130\endcode
131
Gael Guennebaud80f81f92019-01-22 17:08:47 +0100132For column or row vectors, implicit transposition is allowed.
133This means that a column vector can be initialized from a single row:
David Tellenbachdb152b92019-01-21 16:25:57 +0100134\code
Gael Guennebaud80f81f92019-01-22 17:08:47 +0100135VectorXd a {{1.5, 2.5, 3.5}}; // A column-vector with 3 coefficients
136RowVectorXd b {{1.0, 2.0, 3.0, 4.0}}; // A row-vector with 4 coefficients
David Tellenbachdb152b92019-01-21 16:25:57 +0100137\endcode
138
Benoit Jacobe078bb22010-06-26 14:00:00 -0400139\section TutorialMatrixCoeffAccessors Coefficient accessors
Benoit Jacob43388342010-06-25 10:04:35 -0400140
141The primary coefficient accessors and mutators in Eigen are the overloaded parenthesis operators.
142For matrices, the row index is always passed first. For vectors, just pass one index.
143The numbering starts at 0. This example is self-explanatory:
Benoit Jacob43388342010-06-25 10:04:35 -0400144
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200145<table class="example">
146<tr><th>Example:</th><th>Output:</th></tr>
147<tr><td>
148\include tut_matrix_coefficient_accessors.cpp
Jitse Niesen8e776c92010-07-12 12:02:31 +0100149</td>
150<td>
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200151\verbinclude tut_matrix_coefficient_accessors.out
Jitse Niesen8e776c92010-07-12 12:02:31 +0100152</td></tr></table>
153
pvcStillinGradSchoolc86ac712021-08-03 01:48:32 +0000154Note that the syntax `m(index)`
Benoit Jacob43388342010-06-25 10:04:35 -0400155is not restricted to vectors, it is also available for general matrices, meaning index-based access
156in the array of coefficients. This however depends on the matrix's storage order. All Eigen matrices default to
Benoit Jacobe078bb22010-06-26 14:00:00 -0400157column-major storage order, but this can be changed to row-major, see \ref TopicStorageOrders "Storage orders".
Benoit Jacob43388342010-06-25 10:04:35 -0400158
pvcStillinGradSchoolc86ac712021-08-03 01:48:32 +0000159The `operator[]` is also overloaded for index-based access in vectors, but keep in mind that C++ doesn't allow `operator[]` to
160take more than one argument. We restrict `operator[]` to vectors, because an awkwardness in the C++ language
161would make `matrix[i,j]` compile to the same thing as `matrix[j]`!
Benoit Jacob43388342010-06-25 10:04:35 -0400162
Gael Guennebaudaae59942010-06-28 00:22:47 +0200163\section TutorialMatrixCommaInitializer Comma-initialization
164
Jitse Niesen8e776c92010-07-12 12:02:31 +0100165%Matrix and vector coefficients can be conveniently set using the so-called \em comma-initializer syntax.
Gael Guennebaudaae59942010-06-28 00:22:47 +0200166For now, it is enough to know this example:
Jitse Niesen8e776c92010-07-12 12:02:31 +0100167
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200168<table class="example">
169<tr><th>Example:</th><th>Output:</th></tr>
170<tr>
171<td>\include Tutorial_commainit_01.cpp </td>
172<td>\verbinclude Tutorial_commainit_01.out </td>
173</tr></table>
Jitse Niesen8e776c92010-07-12 12:02:31 +0100174
175
Jitse Niesen3428d802010-07-06 10:48:25 +0100176The right-hand side can also contain matrix expressions as discussed in \ref TutorialAdvancedInitialization "this page".
Gael Guennebaudaae59942010-06-28 00:22:47 +0200177
Benoit Jacobe078bb22010-06-26 14:00:00 -0400178\section TutorialMatrixSizesResizing Resizing
Benoit Jacob43388342010-06-25 10:04:35 -0400179
Benoit Jacob8c17fab2010-10-20 09:34:13 -0400180The current size of a matrix can be retrieved by \link EigenBase::rows() rows()\endlink, \link EigenBase::cols() cols() \endlink and \link EigenBase::size() size()\endlink. These methods return the number of rows, the number of columns and the number of coefficients, respectively. Resizing a dynamic-size matrix is done by the \link PlainObjectBase::resize(Index,Index) resize() \endlink method.
Jitse Niesen8e776c92010-07-12 12:02:31 +0100181
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200182<table class="example">
183<tr><th>Example:</th><th>Output:</th></tr>
184<tr>
185<td>\include tut_matrix_resize.cpp </td>
186<td>\verbinclude tut_matrix_resize.out </td>
187</tr></table>
Benoit Jacob43388342010-06-25 10:04:35 -0400188
pvcStillinGradSchoolc86ac712021-08-03 01:48:32 +0000189The `resize()` method is a no-operation if the actual matrix size doesn't change; otherwise it is destructive: the values of the coefficients may change.
190If you want a conservative variant of `resize()` which does not change the coefficients, use \link PlainObjectBase::conservativeResize() conservativeResize()\endlink, see \ref TopicResizing "this page" for more details.
Benoit Jacob43388342010-06-25 10:04:35 -0400191
192All these methods are still available on fixed-size matrices, for the sake of API uniformity. Of course, you can't actually
193resize a fixed-size matrix. Trying to change a fixed size to an actually different value will trigger an assertion failure;
194but the following code is legal:
Jitse Niesen8e776c92010-07-12 12:02:31 +0100195
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200196<table class="example">
197<tr><th>Example:</th><th>Output:</th></tr>
198<tr>
199<td>\include tut_matrix_resize_fixed_size.cpp </td>
200<td>\verbinclude tut_matrix_resize_fixed_size.out </td>
201</tr></table>
Jitse Niesen8e776c92010-07-12 12:02:31 +0100202
Benoit Jacob43388342010-06-25 10:04:35 -0400203
Benoit Jacobe078bb22010-06-26 14:00:00 -0400204\section TutorialMatrixAssignment Assignment and resizing
Benoit Jacob43388342010-06-25 10:04:35 -0400205
Jitse Niesen3428d802010-07-06 10:48:25 +0100206Assignment is the action of copying a matrix into another, using \c operator=. Eigen resizes the matrix on the left-hand side automatically so that it matches the size of the matrix on the right-hand size. For example:
Jitse Niesen8e776c92010-07-12 12:02:31 +0100207
Benoit Jacob9fa54d42010-10-19 08:42:49 -0400208<table class="example">
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200209<tr><th>Example:</th><th>Output:</th></tr>
210<tr>
211<td>\include tut_matrix_assignment_resizing.cpp </td>
212<td>\verbinclude tut_matrix_assignment_resizing.out </td>
213</tr></table>
Benoit Jacobe078bb22010-06-26 14:00:00 -0400214
Jitse Niesen3428d802010-07-06 10:48:25 +0100215Of course, if the left-hand side is of fixed size, resizing it is not allowed.
Benoit Jacobe078bb22010-06-26 14:00:00 -0400216
217If you do not want this automatic resizing to happen (for example for debugging purposes), you can disable it, see
218\ref TopicResizing "this page".
219
220
221\section TutorialMatrixFixedVsDynamic Fixed vs. Dynamic size
222
223When should one use fixed sizes (e.g. \c Matrix4f), and when should one prefer dynamic sizes (e.g. \c MatrixXf)?
Benoit Jacob43388342010-06-25 10:04:35 -0400224The simple answer is: use fixed
225sizes for very small sizes where you can, and use dynamic sizes for larger sizes or where you have to. For small sizes,
226especially for sizes smaller than (roughly) 16, using fixed sizes is hugely beneficial
227to performance, as it allows Eigen to avoid dynamic memory allocation and to unroll
Jitse Niesen4e6d7462013-06-18 14:35:12 +0100228loops. Internally, a fixed-size Eigen matrix is just a plain array, i.e. doing
Benoit Jacob43388342010-06-25 10:04:35 -0400229\code Matrix4f mymatrix; \endcode
230really amounts to just doing
231\code float mymatrix[16]; \endcode
Jitse Niesen30701642010-06-29 11:42:51 +0100232so this really has zero runtime cost. By contrast, the array of a dynamic-size matrix
Benoit Jacob43388342010-06-25 10:04:35 -0400233is always allocated on the heap, so doing
234\code MatrixXf mymatrix(rows,columns); \endcode
235amounts to doing
236\code float *mymatrix = new float[rows*columns]; \endcode
pvcStillinGradSchoolc86ac712021-08-03 01:48:32 +0000237and in addition to that, the \c MatrixXf object stores its number of rows and columns as
Benoit Jacob43388342010-06-25 10:04:35 -0400238member variables.
239
240The limitation of using fixed sizes, of course, is that this is only possible
241when you know the sizes at compile time. Also, for large enough sizes, say for sizes
242greater than (roughly) 32, the performance benefit of using fixed sizes becomes negligible.
Jitse Niesen4e6d7462013-06-18 14:35:12 +0100243Worse, trying to create a very large matrix using fixed sizes inside a function could result in a
244stack overflow, since Eigen will try to allocate the array automatically as a local variable, and
245this is normally done on the stack.
Benoit Jacob43388342010-06-25 10:04:35 -0400246Finally, depending on circumstances, Eigen can also be more aggressive trying to vectorize
Benoit Jacobe078bb22010-06-26 14:00:00 -0400247(use SIMD instructions) when dynamic sizes are used, see \ref TopicVectorization "Vectorization".
Benoit Jacob43388342010-06-25 10:04:35 -0400248
Benoit Jacobe078bb22010-06-26 14:00:00 -0400249\section TutorialMatrixOptTemplParams Optional template parameters
Benoit Jacob43388342010-06-25 10:04:35 -0400250
Jitse Niesen3428d802010-07-06 10:48:25 +0100251We mentioned at the beginning of this page that the Matrix class takes six template parameters,
252but so far we only discussed the first three. The remaining three parameters are optional. Here is
Benoit Jacob43388342010-06-25 10:04:35 -0400253the complete list of template parameters:
254\code
255Matrix<typename Scalar,
256 int RowsAtCompileTime,
257 int ColsAtCompileTime,
258 int Options = 0,
259 int MaxRowsAtCompileTime = RowsAtCompileTime,
260 int MaxColsAtCompileTime = ColsAtCompileTime>
261\endcode
Jitse Niesen3428d802010-07-06 10:48:25 +0100262\li \c Options is a bit field. Here, we discuss only one bit: \c RowMajor. It specifies that the matrices
263 of this type use row-major storage order; by default, the storage order is column-major. See the page on
Benoit Jacobe078bb22010-06-26 14:00:00 -0400264 \ref TopicStorageOrders "storage orders". For example, this type means row-major 3x3 matrices:
Benoit Jacob43388342010-06-25 10:04:35 -0400265 \code
Jitse Niesen3428d802010-07-06 10:48:25 +0100266 Matrix<float, 3, 3, RowMajor>
Benoit Jacob43388342010-06-25 10:04:35 -0400267 \endcode
268\li \c MaxRowsAtCompileTime and \c MaxColsAtCompileTime are useful when you want to specify that, even though
Jitse Niesen3428d802010-07-06 10:48:25 +0100269 the exact sizes of your matrices are not known at compile time, a fixed upper bound is known at
Benoit Jacob43388342010-06-25 10:04:35 -0400270 compile time. The biggest reason why you might want to do that is to avoid dynamic memory allocation.
Jitse Niesen4e6d7462013-06-18 14:35:12 +0100271 For example the following matrix type uses a plain array of 12 floats, without dynamic memory allocation:
Benoit Jacob43388342010-06-25 10:04:35 -0400272 \code
Jitse Niesen3428d802010-07-06 10:48:25 +0100273 Matrix<float, Dynamic, Dynamic, 0, 3, 4>
Benoit Jacob43388342010-06-25 10:04:35 -0400274 \endcode
275
Benoit Jacobe078bb22010-06-26 14:00:00 -0400276\section TutorialMatrixTypedefs Convenience typedefs
Benoit Jacob43388342010-06-25 10:04:35 -0400277
278Eigen defines the following Matrix typedefs:
pvcStillinGradSchoolc86ac712021-08-03 01:48:32 +0000279\li \c MatrixNt for `Matrix<type, N, N>`. For example, \c MatrixXi for `Matrix<int, Dynamic, Dynamic>`.
280\li \c VectorNt for `Matrix<type, N, 1>`. For example, \c Vector2f for `Matrix<float, 2, 1>`.
281\li \c RowVectorNt for `Matrix<type, 1, N>`. For example, \c RowVector3d for `Matrix<double, 1, 3>`.
Benoit Jacob43388342010-06-25 10:04:35 -0400282
283Where:
pvcStillinGradSchoolc86ac712021-08-03 01:48:32 +0000284\li \c N can be any one of \c 2, \c 3, \c 4, or \c X (meaning \c Dynamic).
285\li \c t can be any one of \c i (meaning \c int), \c f (meaning \c float), \c d (meaning \c double),
286 \c cf (meaning `complex<float>`), or \c cd (meaning `complex<double>`). The fact that `typedef`s are only
Jitse Niesen3428d802010-07-06 10:48:25 +0100287 defined for these five types doesn't mean that they are the only supported scalar types. For example,
Benoit Jacobe078bb22010-06-26 14:00:00 -0400288 all standard integer types are supported, see \ref TopicScalarTypes "Scalar types".
289
Benoit Jacob43388342010-06-25 10:04:35 -0400290
291*/
292
Jitse Niesen30701642010-06-29 11:42:51 +0100293}