blob: b1f9393ac3a9a36dc0c04363eb321a7ba2838a4f [file] [log] [blame]
Benoit Jacob43388342010-06-25 10:04:35 -04001namespace Eigen {
2
Jitse Niesen9fa4e9a2010-07-05 10:59:29 +01003/** \page TutorialMatrixClass Tutorial page 1 - The %Matrix class
Benoit Jacob43388342010-06-25 10:04:35 -04004
5\ingroup Tutorial
6
Benoit Jacobe078bb22010-06-26 14:00:00 -04007\li \b Previous: \ref GettingStarted
8\li \b Next: \ref TutorialMatrixArithmetic
9
Gael Guennebaudf98c7582010-06-27 20:21:12 +020010We assume that you have already read the quick \link GettingStarted "getting started" \endlink tutorial.
Benoit Jacob43388342010-06-25 10:04:35 -040011This page is the first one in a much longer multi-page tutorial.
Gael Guennebaud2ea1e492012-12-28 18:58:07 +010012
13\tableofcontents
Benoit Jacobe078bb22010-06-26 14:00:00 -040014
Jitse Niesen3428d802010-07-06 10:48:25 +010015In Eigen, all matrices and vectors are objects of the Matrix template class.
Benoit Jacob43388342010-06-25 10:04:35 -040016Vectors are just a special case of matrices, with either 1 row or 1 column.
17
Jitse Niesen3428d802010-07-06 10:48:25 +010018\section TutorialMatrixFirst3Params The first three template parameters of Matrix
Benoit Jacob43388342010-06-25 10:04:35 -040019
Jitse Niesen3428d802010-07-06 10:48:25 +010020The Matrix class takes six template parameters, but for now it's enough to
21learn about the first three first parameters. The three remaining parameters have default
Benoit Jacob43388342010-06-25 10:04:35 -040022values, which for now we will leave untouched, and which we
Benoit Jacobe078bb22010-06-26 14:00:00 -040023\ref TutorialMatrixOptTemplParams "discuss below".
Benoit Jacob43388342010-06-25 10:04:35 -040024
Jitse Niesen3428d802010-07-06 10:48:25 +010025The three mandatory template parameters of Matrix are:
Benoit Jacob43388342010-06-25 10:04:35 -040026\code
27Matrix<typename Scalar, int RowsAtCompileTime, int ColsAtCompileTime>
28\endcode
29\li \c Scalar is the scalar type, i.e. the type of the coefficients.
30 That is, if you want a matrix of floats, choose \c float here.
Benoit Jacobe078bb22010-06-26 14:00:00 -040031 See \ref TopicScalarTypes "Scalar types" for a list of all supported
Benoit Jacob43388342010-06-25 10:04:35 -040032 scalar types and for how to extend support to new types.
33\li \c RowsAtCompileTime and \c ColsAtCompileTime are the number of rows
Jitse Niesen3428d802010-07-06 10:48:25 +010034 and columns of the matrix as known at compile time (see
35 \ref TutorialMatrixDynamic "below" for what to do if the number is not
36 known at compile time).
Benoit Jacob43388342010-06-25 10:04:35 -040037
38We offer a lot of convenience typedefs to cover the usual cases. For example, \c Matrix4f is
39a 4x4 matrix of floats. Here is how it is defined by Eigen:
40\code
Jitse Niesen3428d802010-07-06 10:48:25 +010041typedef Matrix<float, 4, 4> Matrix4f;
Benoit Jacob43388342010-06-25 10:04:35 -040042\endcode
Benoit Jacobe078bb22010-06-26 14:00:00 -040043We discuss \ref TutorialMatrixTypedefs "below" these convenience typedefs.
Benoit Jacob43388342010-06-25 10:04:35 -040044
Benoit Jacobe078bb22010-06-26 14:00:00 -040045\section TutorialMatrixVectors Vectors
Benoit Jacob43388342010-06-25 10:04:35 -040046
47As mentioned above, in Eigen, vectors are just a special case of
48matrices, with either 1 row or 1 column. The case where they have 1 column is the most common;
49such vectors are called column-vectors, often abbreviated as just vectors. In the other case
50where they have 1 row, they are called row-vectors.
51
Jitse Niesen3428d802010-07-06 10:48:25 +010052For 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 -040053\code
54typedef Matrix<float, 3, 1> Vector3f;
55\endcode
Jitse Niesen3428d802010-07-06 10:48:25 +010056We also offer convenience typedefs for row-vectors, for example:
Benoit Jacob43388342010-06-25 10:04:35 -040057\code
58typedef Matrix<int, 1, 2> RowVector2i;
59\endcode
60
Benoit Jacobe078bb22010-06-26 14:00:00 -040061\section TutorialMatrixDynamic The special value Dynamic
Benoit Jacob43388342010-06-25 10:04:35 -040062
63Of course, Eigen is not limited to matrices whose dimensions are known at compile time.
Jitse Niesen3428d802010-07-06 10:48:25 +010064The \c RowsAtCompileTime and \c ColsAtCompileTime template parameters can take the special
Benoit Jacob43388342010-06-25 10:04:35 -040065value \c Dynamic which indicates that the size is unknown at compile time, so must
Jitse Niesen3428d802010-07-06 10:48:25 +010066be handled as a run-time variable. In Eigen terminology, such a size is referred to as a
Benoit Jacob43388342010-06-25 10:04:35 -040067\em dynamic \em size; while a size that is known at compile time is called a
68\em fixed \em size. For example, the convenience typedef \c MatrixXd, meaning
69a matrix of doubles with dynamic size, is defined as follows:
70\code
Jitse Niesen3428d802010-07-06 10:48:25 +010071typedef Matrix<double, Dynamic, Dynamic> MatrixXd;
Benoit Jacob43388342010-06-25 10:04:35 -040072\endcode
73And similarly, we define a self-explanatory typedef \c VectorXi as follows:
74\code
Jitse Niesen3428d802010-07-06 10:48:25 +010075typedef Matrix<int, Dynamic, 1> VectorXi;
Benoit Jacob43388342010-06-25 10:04:35 -040076\endcode
77You can perfectly have e.g. a fixed number of rows with a dynamic number of columns, as in:
78\code
79Matrix<float, 3, Dynamic>
80\endcode
81
Benoit Jacobe078bb22010-06-26 14:00:00 -040082\section TutorialMatrixConstructors Constructors
Benoit Jacob43388342010-06-25 10:04:35 -040083
Benoit Jacob26129222010-10-15 09:44:43 -040084A 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 -040085\code
86Matrix3f a;
87MatrixXf b;
88\endcode
89Here,
90\li \c a is a 3x3 matrix, with a static float[9] array of uninitialized coefficients,
91\li \c b is a dynamic-size matrix whose size is currently 0x0, and whose array of
92coefficients hasn't yet been allocated at all.
93
94Constructors taking sizes are also available. For matrices, the number of rows is always passed first.
95For vectors, just pass the vector size. They allocate the array of coefficients
96with the given size, but don't initialize the coefficients themselves:
97\code
98MatrixXf a(10,15);
99VectorXf b(30);
100\endcode
101Here,
102\li \c a is a 10x15 dynamic-size matrix, with allocated but currently uninitialized coefficients.
103\li \c b is a dynamic-size vector of size 30, with allocated but currently uninitialized coefficients.
104
105In order to offer a uniform API across fixed-size and dynamic-size matrices, it is legal to use these
106constructors on fixed-size matrices, even if passing the sizes is useless in this case. So this is legal:
107\code
108Matrix3f a(3,3);
109\endcode
110and is a no-operation.
111
112Finally, we also offer some constructors to initialize the coefficients of small fixed-size vectors up to size 4:
113\code
114Vector2d a(5.0, 6.0);
115Vector3d b(5.0, 6.0, 7.0);
116Vector4d c(5.0, 6.0, 7.0, 8.0);
117\endcode
118
Benoit Jacobe078bb22010-06-26 14:00:00 -0400119\section TutorialMatrixCoeffAccessors Coefficient accessors
Benoit Jacob43388342010-06-25 10:04:35 -0400120
121The primary coefficient accessors and mutators in Eigen are the overloaded parenthesis operators.
122For matrices, the row index is always passed first. For vectors, just pass one index.
123The numbering starts at 0. This example is self-explanatory:
Benoit Jacob43388342010-06-25 10:04:35 -0400124
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200125<table class="example">
126<tr><th>Example:</th><th>Output:</th></tr>
127<tr><td>
128\include tut_matrix_coefficient_accessors.cpp
Jitse Niesen8e776c92010-07-12 12:02:31 +0100129</td>
130<td>
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200131\verbinclude tut_matrix_coefficient_accessors.out
Jitse Niesen8e776c92010-07-12 12:02:31 +0100132</td></tr></table>
133
134Note that the syntax <tt> m(index) </tt>
Benoit Jacob43388342010-06-25 10:04:35 -0400135is not restricted to vectors, it is also available for general matrices, meaning index-based access
136in 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 -0400137column-major storage order, but this can be changed to row-major, see \ref TopicStorageOrders "Storage orders".
Benoit Jacob43388342010-06-25 10:04:35 -0400138
139The operator[] is also overloaded for index-based access in vectors, but keep in mind that C++ doesn't allow operator[] to
140take more than one argument. We restrict operator[] to vectors, because an awkwardness in the C++ language
141would make matrix[i,j] compile to the same thing as matrix[j] !
142
Gael Guennebaudaae59942010-06-28 00:22:47 +0200143\section TutorialMatrixCommaInitializer Comma-initialization
144
Jitse Niesen8e776c92010-07-12 12:02:31 +0100145%Matrix and vector coefficients can be conveniently set using the so-called \em comma-initializer syntax.
Gael Guennebaudaae59942010-06-28 00:22:47 +0200146For now, it is enough to know this example:
Jitse Niesen8e776c92010-07-12 12:02:31 +0100147
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200148<table class="example">
149<tr><th>Example:</th><th>Output:</th></tr>
150<tr>
151<td>\include Tutorial_commainit_01.cpp </td>
152<td>\verbinclude Tutorial_commainit_01.out </td>
153</tr></table>
Jitse Niesen8e776c92010-07-12 12:02:31 +0100154
155
Jitse Niesen3428d802010-07-06 10:48:25 +0100156The right-hand side can also contain matrix expressions as discussed in \ref TutorialAdvancedInitialization "this page".
Gael Guennebaudaae59942010-06-28 00:22:47 +0200157
Benoit Jacobe078bb22010-06-26 14:00:00 -0400158\section TutorialMatrixSizesResizing Resizing
Benoit Jacob43388342010-06-25 10:04:35 -0400159
Benoit Jacob8c17fab2010-10-20 09:34:13 -0400160The 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 +0100161
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200162<table class="example">
163<tr><th>Example:</th><th>Output:</th></tr>
164<tr>
165<td>\include tut_matrix_resize.cpp </td>
166<td>\verbinclude tut_matrix_resize.out </td>
167</tr></table>
Benoit Jacob43388342010-06-25 10:04:35 -0400168
Jitse Niesen3428d802010-07-06 10:48:25 +0100169The 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.
Benoit Jacob8c17fab2010-10-20 09:34:13 -0400170If 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 -0400171
172All these methods are still available on fixed-size matrices, for the sake of API uniformity. Of course, you can't actually
173resize a fixed-size matrix. Trying to change a fixed size to an actually different value will trigger an assertion failure;
174but the following code is legal:
Jitse Niesen8e776c92010-07-12 12:02:31 +0100175
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200176<table class="example">
177<tr><th>Example:</th><th>Output:</th></tr>
178<tr>
179<td>\include tut_matrix_resize_fixed_size.cpp </td>
180<td>\verbinclude tut_matrix_resize_fixed_size.out </td>
181</tr></table>
Jitse Niesen8e776c92010-07-12 12:02:31 +0100182
Benoit Jacob43388342010-06-25 10:04:35 -0400183
Benoit Jacobe078bb22010-06-26 14:00:00 -0400184\section TutorialMatrixAssignment Assignment and resizing
Benoit Jacob43388342010-06-25 10:04:35 -0400185
Jitse Niesen3428d802010-07-06 10:48:25 +0100186Assignment 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 +0100187
Benoit Jacob9fa54d42010-10-19 08:42:49 -0400188<table class="example">
Gael Guennebaudf66fe262010-10-19 11:40:49 +0200189<tr><th>Example:</th><th>Output:</th></tr>
190<tr>
191<td>\include tut_matrix_assignment_resizing.cpp </td>
192<td>\verbinclude tut_matrix_assignment_resizing.out </td>
193</tr></table>
Benoit Jacobe078bb22010-06-26 14:00:00 -0400194
Jitse Niesen3428d802010-07-06 10:48:25 +0100195Of course, if the left-hand side is of fixed size, resizing it is not allowed.
Benoit Jacobe078bb22010-06-26 14:00:00 -0400196
197If you do not want this automatic resizing to happen (for example for debugging purposes), you can disable it, see
198\ref TopicResizing "this page".
199
200
201\section TutorialMatrixFixedVsDynamic Fixed vs. Dynamic size
202
203When 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 -0400204The simple answer is: use fixed
205sizes for very small sizes where you can, and use dynamic sizes for larger sizes or where you have to. For small sizes,
206especially for sizes smaller than (roughly) 16, using fixed sizes is hugely beneficial
207to performance, as it allows Eigen to avoid dynamic memory allocation and to unroll
208loops. Internally, a fixed-size Eigen matrix is just a plain static array, i.e. doing
209\code Matrix4f mymatrix; \endcode
210really amounts to just doing
211\code float mymatrix[16]; \endcode
Jitse Niesen30701642010-06-29 11:42:51 +0100212so this really has zero runtime cost. By contrast, the array of a dynamic-size matrix
Benoit Jacob43388342010-06-25 10:04:35 -0400213is always allocated on the heap, so doing
214\code MatrixXf mymatrix(rows,columns); \endcode
215amounts to doing
216\code float *mymatrix = new float[rows*columns]; \endcode
217and in addition to that, the MatrixXf object stores its number of rows and columns as
218member variables.
219
220The limitation of using fixed sizes, of course, is that this is only possible
221when you know the sizes at compile time. Also, for large enough sizes, say for sizes
222greater than (roughly) 32, the performance benefit of using fixed sizes becomes negligible.
223Worse, trying to create a very large matrix using fixed sizes could result in a stack overflow,
224since Eigen will try to allocate the array as a static array, which by default goes on the stack.
225Finally, depending on circumstances, Eigen can also be more aggressive trying to vectorize
Benoit Jacobe078bb22010-06-26 14:00:00 -0400226(use SIMD instructions) when dynamic sizes are used, see \ref TopicVectorization "Vectorization".
Benoit Jacob43388342010-06-25 10:04:35 -0400227
Benoit Jacobe078bb22010-06-26 14:00:00 -0400228\section TutorialMatrixOptTemplParams Optional template parameters
Benoit Jacob43388342010-06-25 10:04:35 -0400229
Jitse Niesen3428d802010-07-06 10:48:25 +0100230We mentioned at the beginning of this page that the Matrix class takes six template parameters,
231but so far we only discussed the first three. The remaining three parameters are optional. Here is
Benoit Jacob43388342010-06-25 10:04:35 -0400232the complete list of template parameters:
233\code
234Matrix<typename Scalar,
235 int RowsAtCompileTime,
236 int ColsAtCompileTime,
237 int Options = 0,
238 int MaxRowsAtCompileTime = RowsAtCompileTime,
239 int MaxColsAtCompileTime = ColsAtCompileTime>
240\endcode
Jitse Niesen3428d802010-07-06 10:48:25 +0100241\li \c Options is a bit field. Here, we discuss only one bit: \c RowMajor. It specifies that the matrices
242 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 -0400243 \ref TopicStorageOrders "storage orders". For example, this type means row-major 3x3 matrices:
Benoit Jacob43388342010-06-25 10:04:35 -0400244 \code
Jitse Niesen3428d802010-07-06 10:48:25 +0100245 Matrix<float, 3, 3, RowMajor>
Benoit Jacob43388342010-06-25 10:04:35 -0400246 \endcode
247\li \c MaxRowsAtCompileTime and \c MaxColsAtCompileTime are useful when you want to specify that, even though
Jitse Niesen3428d802010-07-06 10:48:25 +0100248 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 -0400249 compile time. The biggest reason why you might want to do that is to avoid dynamic memory allocation.
250 For example the following matrix type uses a static array of 12 floats, without dynamic memory allocation:
251 \code
Jitse Niesen3428d802010-07-06 10:48:25 +0100252 Matrix<float, Dynamic, Dynamic, 0, 3, 4>
Benoit Jacob43388342010-06-25 10:04:35 -0400253 \endcode
254
Benoit Jacobe078bb22010-06-26 14:00:00 -0400255\section TutorialMatrixTypedefs Convenience typedefs
Benoit Jacob43388342010-06-25 10:04:35 -0400256
257Eigen defines the following Matrix typedefs:
Benoit Jacob08c17c42010-07-01 20:29:13 -0400258\li MatrixNt for Matrix<type, N, N>. For example, MatrixXi for Matrix<int, Dynamic, Dynamic>.
259\li VectorNt for Matrix<type, N, 1>. For example, Vector2f for Matrix<float, 2, 1>.
260\li RowVectorNt for Matrix<type, 1, N>. For example, RowVector3d for Matrix<double, 1, 3>.
Benoit Jacob43388342010-06-25 10:04:35 -0400261
262Where:
Jitse Niesen3428d802010-07-06 10:48:25 +0100263\li N can be any one of \c 2, \c 3, \c 4, or \c X (meaning \c Dynamic).
Benoit Jacob08c17c42010-07-01 20:29:13 -0400264\li t can be any one of \c i (meaning int), \c f (meaning float), \c d (meaning double),
Benoit Jacob43388342010-06-25 10:04:35 -0400265 \c cf (meaning complex<float>), or \c cd (meaning complex<double>). The fact that typedefs are only
Jitse Niesen3428d802010-07-06 10:48:25 +0100266 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 -0400267 all standard integer types are supported, see \ref TopicScalarTypes "Scalar types".
268
269\li \b Next: \ref TutorialMatrixArithmetic
Benoit Jacob43388342010-06-25 10:04:35 -0400270
271*/
272
Jitse Niesen30701642010-06-29 11:42:51 +0100273}