![]() |
Eigen
3.4.0
|
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";
| Here is the vector v: 2 -9 -2 7 |
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";
| Here is the initial vector v: 2 9 2 7 Here is the sorted vector v: 2 2 7 9 |
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";
| Here are the coeffs of the 2x2 matrix A: 2 -9 -2 7 |
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";
| Here is the initial matrix A: 2 2 6 1 9 6 3 0 2 6 6 3 7 9 5 3 Here is the sorted matrix A: 1 2 2 6 0 3 6 9 2 3 6 6 3 5 7 9 |