Gael Guennebaud
2018-10-02 12:53:49 UTC
Hi list,
we're eventually implementing STL iterators to iterator over the
coefficients of a vector/matrix as well as over the columns or rows of a
matrix, and your inputs might be welcome to help converging to a stable
API, see below.
You can watch the WIP in PR 519 [1], and find some background in bug 231
[2]. Basically, to avoid ambiguities, we decided that iterators over
coefficients would be defined for 1D expression only, meaning that to
iterate over the elements of a 2D Matrix you'll have to explicitly reshape
it as a 1D vector first. Some typical examples:
VectorXd v;
MatrixXd A;
for(auto x : v) {...}
for(auto x : A.col(j)) {...}
for(auto x : A.row(i)) {...}
for(auto x : A.reshaped()) {...}
The last line iterate in column-major order regardless of the storage order
of A. So far so good. Things get more tricky now.
To iterate over rows or columns, we need to define a proxy telling so. One
option is to reuse (abuse?) rowwise()/colwise():
for(auto x : A.rowwise()) { ... }
Is it obvious to everyone that this line is iterating over the rows of A
and is thus a synonym for:
for(int i=0;i<A.rows();++i) { auto x = A.row(i); ... }
??
On my side, I'm rather reading it as "iterate over all elements of A in
row-major order", which is unfortunate as if I'm not alone with such an
interpretation, then we need to come up with new names. Since rows()/cols()
are already taken, we could think of:
for(auto x : A.allRows()) { ... }
for(auto x : A.rowSet()) { ... }
?????
Feel free to share your opinion on that question as well as on the other
minor issues discussed in the PR.
thanks,
gael
[1] https://bitbucket.org/eigen/eigen/pull-requests/519/
[2] http://eigen.tuxfamily.org/bz/show_bug.cgi?id=231
we're eventually implementing STL iterators to iterator over the
coefficients of a vector/matrix as well as over the columns or rows of a
matrix, and your inputs might be welcome to help converging to a stable
API, see below.
You can watch the WIP in PR 519 [1], and find some background in bug 231
[2]. Basically, to avoid ambiguities, we decided that iterators over
coefficients would be defined for 1D expression only, meaning that to
iterate over the elements of a 2D Matrix you'll have to explicitly reshape
it as a 1D vector first. Some typical examples:
VectorXd v;
MatrixXd A;
for(auto x : v) {...}
for(auto x : A.col(j)) {...}
for(auto x : A.row(i)) {...}
for(auto x : A.reshaped()) {...}
The last line iterate in column-major order regardless of the storage order
of A. So far so good. Things get more tricky now.
To iterate over rows or columns, we need to define a proxy telling so. One
option is to reuse (abuse?) rowwise()/colwise():
for(auto x : A.rowwise()) { ... }
Is it obvious to everyone that this line is iterating over the rows of A
and is thus a synonym for:
for(int i=0;i<A.rows();++i) { auto x = A.row(i); ... }
??
On my side, I'm rather reading it as "iterate over all elements of A in
row-major order", which is unfortunate as if I'm not alone with such an
interpretation, then we need to come up with new names. Since rows()/cols()
are already taken, we could think of:
for(auto x : A.allRows()) { ... }
for(auto x : A.rowSet()) { ... }
?????
Feel free to share your opinion on that question as well as on the other
minor issues discussed in the PR.
thanks,
gael
[1] https://bitbucket.org/eigen/eigen/pull-requests/519/
[2] http://eigen.tuxfamily.org/bz/show_bug.cgi?id=231