[eigen] On the implementation of STL iterator for Eigen::Matrix

[ Thread Index | Date Index | More lists.tuxfamily.org/eigen Archives ]

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.


[1] https://bitbucket.org/eigen/eigen/pull-requests/519/
[2] http://eigen.tuxfamily.org/bz/show_bug.cgi?id=231

Mail converted by MHonArc 2.6.19+ http://listengine.tuxfamily.org/