![]() |
Eigen
3.4.90 (git rev 5a9f66fb35d03a4da9ef8976e67a61b30aa16dcf)
|
Since the version 3.4, Eigen's dense matrices and arrays provide STL compatible iterators. As demonstrated below, this makes them naturally compatible with range-for-loops and STL's algorithms.
Any dense 1D expressions exposes the pair of begin()/end()
methods to iterate over them.
This directly enables c++11 range for loops:
Example: | Output: |
---|---|
VectorXi v = VectorXi::Random(4);
cout << "Here is the vector v:\n";
for (auto x : v) cout << x << " ";
cout << "\n";
|
One dimensional expressions can also easily be passed to STL algorithms:
Example: | Output: |
---|---|
Array4i v = Array4i::Random().abs();
cout << "Here is the initial vector v:\n" << v.transpose() << "\n";
std::sort(v.begin(), v.end());
cout << "Here is the sorted vector v:\n" << v.transpose() << "\n";
|
Similar to std::vector
, 1D expressions also exposes the pair of cbegin()/cend()
methods to conveniently get const iterators on non-const object.
STL iterators are intrinsically designed to iterate over 1D structures. This is why begin()/end()
methods are disabled for 2D expressions. Iterating over all coefficients of a 2D expressions is still easily accomplished by creating a 1D linear view through reshaped()
:
Example: | Output: |
---|---|
Matrix2i A = Matrix2i::Random();
cout << "Here are the coeffs of the 2x2 matrix A:\n";
for (auto x : A.reshaped()) cout << x << " ";
cout << "\n";
|
It is also possible to get iterators over rows or columns of 2D expressions. Those are available through the rowwise()
and colwise()
proxies. Here is an example sorting each row of a matrix:
Example: | Output: |
---|---|
ArrayXXi A = ArrayXXi::Random(4, 4).abs();
cout << "Here is the initial matrix A:\n" << A << "\n";
for (auto row : A.rowwise()) std::sort(row.begin(), row.end());
cout << "Here is the sorted matrix A:\n" << A << "\n";
|