Eigen
3.4.90 (git rev 9297aae66fd4c13230769c66702c88cde9f355a0)

In Eigen, all matrices and vectors are objects of the Matrix template class. Vectors are just a special case of matrices, with either 1 row or 1 column.
The Matrix class takes six template parameters, but for now it's enough to learn about the first three first parameters. The three remaining parameters have default values, which for now we will leave untouched, and which we discuss below.
The three mandatory template parameters of Matrix are:
Scalar
is the scalar type, i.e. the type of the coefficients. That is, if you want a matrix of floats, choose float
here. See Scalar types for a list of all supported scalar types and for how to extend support to new types. RowsAtCompileTime
and ColsAtCompileTime
are the number of rows and columns of the matrix as known at compile time (see below for what to do if the number is not known at compile time).We offer a lot of convenience typedefs to cover the usual cases. For example, Matrix4f
is a 4x4 matrix of floats. Here is how it is defined by Eigen:
We discuss below these convenience typedefs.
As mentioned above, in Eigen, vectors are just a special case of matrices, with either 1 row or 1 column. The case where they have 1 column is the most common; such vectors are called columnvectors, often abbreviated as just vectors. In the other case where they have 1 row, they are called rowvectors.
For example, the convenience typedef Vector3f
is a (column) vector of 3 floats. It is defined as follows by Eigen:
We also offer convenience typedefs for rowvectors, for example:
Of course, Eigen is not limited to matrices whose dimensions are known at compile time. The RowsAtCompileTime
and ColsAtCompileTime
template parameters can take the special value Dynamic
which indicates that the size is unknown at compile time, so must be handled as a runtime variable. In Eigen terminology, such a size is referred to as a dynamic size; while a size that is known at compile time is called a fixed size. For example, the convenience typedef MatrixXd
, meaning a matrix of doubles with dynamic size, is defined as follows:
And similarly, we define a selfexplanatory typedef VectorXi
as follows:
You can perfectly have e.g. a fixed number of rows with a dynamic number of columns, as in:
A default constructor is always available, never performs any dynamic memory allocation, and never initializes the matrix coefficients. You can do:
Here,
a
is a 3by3 matrix, with a plain float[9] array of uninitialized coefficients, b
is a dynamicsize matrix whose size is currently 0by0, and whose array of coefficients hasn't yet been allocated at all.Constructors taking sizes are also available. For matrices, the number of rows is always passed first. For vectors, just pass the vector size. They allocate the array of coefficients with the given size, but don't initialize the coefficients themselves:
Here,
a
is a 10x15 dynamicsize matrix, with allocated but currently uninitialized coefficients. b
is a dynamicsize vector of size 30, with allocated but currently uninitialized coefficients.In order to offer a uniform API across fixedsize and dynamicsize matrices, it is legal to use these constructors on fixedsize matrices, even if passing the sizes is useless in this case. So this is legal:
and is a nooperation.
Matrices and vectors can also be initialized from lists of coefficients. Prior to C++11, this feature is limited to small fixedsize column or vectors up to size 4:
If C++11 is enabled, fixedsize column or row vectors of arbitrary size can be initialized by passing an arbitrary number of coefficients:
In the general case of matrices and vectors with either fixed or runtime sizes, coefficients have to be grouped by rows and passed as an initializer list of initializer list (details ):
For column or row vectors, implicit transposition is allowed. This means that a column vector can be initialized from a single row:
The primary coefficient accessors and mutators in Eigen are the overloaded parenthesis operators. For matrices, the row index is always passed first. For vectors, just pass one index. The numbering starts at 0. This example is selfexplanatory:
Example:  Output: 

#include <iostream>
#include <Eigen/Dense>
int main()
{
Eigen::MatrixXd m(2,2);
m(0,0) = 3;
m(1,0) = 2.5;
m(0,1) = 1;
m(1,1) = m(1,0) + m(0,1);
std::cout << "Here is the matrix m:\n" << m << std::endl;
Eigen::VectorXd v(2);
v(0) = 4;
v(1) = v(0)  1;
std::cout << "Here is the vector v:\n" << v << std::endl;
}
 Here is the matrix m: 3 1 2.5 1.5 Here is the vector v: 4 3 
Note that the syntax m(index)
is not restricted to vectors, it is also available for general matrices, meaning indexbased access in the array of coefficients. This however depends on the matrix's storage order. All Eigen matrices default to columnmajor storage order, but this can be changed to rowmajor, see Storage orders.
The operator[]
is also overloaded for indexbased access in vectors, but keep in mind that C++ doesn't allow operator[]
to take more than one argument. We restrict operator[]
to vectors, because an awkwardness in the C++ language would make matrix[i,j]
compile to the same thing as matrix[j]
!
Matrix and vector coefficients can be conveniently set using the socalled commainitializer syntax. For now, it is enough to know this example:
Example:  Output: 

1 2 3 4 5 6 7 8 9 
The righthand side can also contain matrix expressions as discussed in this page.
The current size of a matrix can be retrieved by rows(), cols() and size(). These methods return the number of rows, the number of columns and the number of coefficients, respectively. Resizing a dynamicsize matrix is done by the resize() method.
Example:  Output: 

#include <iostream>
#include <Eigen/Dense>
int main()
{
Eigen::MatrixXd m(2,5);
m.resize(4,3);
std::cout << "The matrix m is of size "
<< m.rows() << "x" << m.cols() << std::endl;
std::cout << "It has " << m.size() << " coefficients" << std::endl;
Eigen::VectorXd v(2);
v.resize(5);
std::cout << "The vector v is of size " << v.size() << std::endl;
std::cout << "As a matrix, v is of size "
<< v.rows() << "x" << v.cols() << std::endl;
}
 The matrix m is of size 4x3 It has 12 coefficients The vector v is of size 5 As a matrix, v is of size 5x1 
The resize()
method is a nooperation if the actual matrix size doesn't change; otherwise it is destructive: the values of the coefficients may change. If you want a conservative variant of resize()
which does not change the coefficients, use conservativeResize(), see this page for more details.
All these methods are still available on fixedsize matrices, for the sake of API uniformity. Of course, you can't actually resize a fixedsize matrix. Trying to change a fixed size to an actually different value will trigger an assertion failure; but the following code is legal:
Example:  Output: 

#include <iostream>
#include <Eigen/Dense>
int main()
{
m.resize(4,4); // no operation
std::cout << "The matrix m is of size "
<< m.rows() << "x" << m.cols() << std::endl;
}
constexpr void resize(Index rows, Index cols) Definition: PlainObjectBase.h:265  The matrix m is of size 4x4 
Assignment is the action of copying a matrix into another, using operator=
. Eigen resizes the matrix on the lefthand side automatically so that it matches the size of the matrix on the righthand size. For example:
Example:  Output: 

a is of size 2x2 a is now of size 3x3 
Of course, if the lefthand side is of fixed size, resizing it is not allowed.
If you do not want this automatic resizing to happen (for example for debugging purposes), you can disable it, see this page.
When should one use fixed sizes (e.g. Matrix4f
), and when should one prefer dynamic sizes (e.g. MatrixXf
)? The simple answer is: use fixed sizes for very small sizes where you can, and use dynamic sizes for larger sizes or where you have to. For small sizes, especially for sizes smaller than (roughly) 16, using fixed sizes is hugely beneficial to performance, as it allows Eigen to avoid dynamic memory allocation and to unroll loops. Internally, a fixedsize Eigen matrix is just a plain array, i.e. doing
really amounts to just doing
so this really has zero runtime cost. By contrast, the array of a dynamicsize matrix is always allocated on the heap, so doing
amounts to doing
and in addition to that, the MatrixXf
object stores its number of rows and columns as member variables.
The limitation of using fixed sizes, of course, is that this is only possible when you know the sizes at compile time. Also, for large enough sizes, say for sizes greater than (roughly) 32, the performance benefit of using fixed sizes becomes negligible. Worse, trying to create a very large matrix using fixed sizes inside a function could result in a stack overflow, since Eigen will try to allocate the array automatically as a local variable, and this is normally done on the stack. Finally, depending on circumstances, Eigen can also be more aggressive trying to vectorize (use SIMD instructions) when dynamic sizes are used, see Vectorization.
We mentioned at the beginning of this page that the Matrix class takes six template parameters, but so far we only discussed the first three. The remaining three parameters are optional. Here is the complete list of template parameters:
Options
is a bit field. Here, we discuss only one bit: RowMajor
. It specifies that the matrices of this type use rowmajor storage order; by default, the storage order is columnmajor. See the page on storage orders. For example, this type means rowmajor 3x3 matrices: MaxRowsAtCompileTime
and MaxColsAtCompileTime
are useful when you want to specify that, even though the exact sizes of your matrices are not known at compile time, a fixed upper bound is known at compile time. The biggest reason why you might want to do that is to avoid dynamic memory allocation. For example the following matrix type uses a plain array of 12 floats, without dynamic memory allocation: Eigen defines the following Matrix typedefs:
MatrixNt
for Matrix<type, N, N>
. For example, MatrixXi
for Matrix<int, Dynamic, Dynamic>
. MatrixXNt
for Matrix<type, Dynamic, N>
. For example, MatrixX3i
for Matrix<int, Dynamic, 3>
. MatrixNXt
for Matrix<type, N, Dynamic>
. For example, Matrix4Xd
for Matrix<d, 4, Dynamic>
. VectorNt
for Matrix<type, N, 1>
. For example, Vector2f
for Matrix<float, 2, 1>
. RowVectorNt
for Matrix<type, 1, N>
. For example, RowVector3d
for Matrix<double, 1, 3>
.Where:
N
can be any one of 2
, 3
, 4
, or X
(meaning Dynamic
). t
can be any one of i
(meaning int
), f
(meaning float
), d
(meaning double
), cf
(meaning complex<float>
), or cd
(meaning complex<double>
). The fact that typedef
s are only defined for these five types doesn't mean that they are the only supported scalar types. For example, all standard integer types are supported, see Scalar types.