Opened 14 years ago

Closed 12 years ago

#263 closed discussion (fixed)

matrix and iterators

Reported by: Peter Owned by: Jari Häkkinen
Priority: major Milestone: yat 0.4
Component: utility Version: trunk
Keywords: Cc:

Description (last modified by Peter)

related to ticket:256 and ticket:267

I would like to have three types of iterators for matrix

  1. Iterating over elements, i.e., value_type is double.
  2. Iterating over row vectors, i.e., value_type is (row) vector.
  3. Iterating over column vectors, i.e., value_type is (column) vector

This means that operator* for 2 and 3 should return a utility::vector. Multiplied to this is of course const versions as well as iterators for DataLookup2D.

Change History (7)

comment:1 Changed 14 years ago by Peter

Description: modified (diff)

Tried to clarify the descr.

comment:2 Changed 14 years ago by Peter

In items 2 and 3 in description above iterators are models of a pointer to a vector.

In addition to this (as discussed in private emails) it would be useful to have an iterator that is intended to iterator over, e.g., row 1. Use case could be

some_function(const matrix& x)
{ 
...
   statistics::AveragerPair ap;
   add(ap, x.begin_row(0), x.end_row(0), x.begin_row(1));
...
}

trying to that add with current interface would look something like

   add(ap, vector(x,0).begin(), vector(x,0).end(), vector(x,1).begin());

This is dangerous (and I don't even know if it compiles). If it compiles, it would most likely fail during runtime. Why? Because the iterators passed as second and third arguments, respectively, are not pointing to the same container. Therefore, the operator== will not behave as you would expect, and the add function will add many more values than you expect.

comment:3 Changed 14 years ago by Peter

You can and should (of course) write it in a couple of lines instead

vector vec1(x,0);
vector vec2(x,1);
add(ap, vec1.begin(), vec1.end(), vec2.begin());

So what is complete and what is minimalistic in this case?

comment:4 Changed 14 years ago by Peter

Description: modified (diff)

comment:5 Changed 12 years ago by Jari Häkkinen

I am not sure if this post belongs to this ticket.

I'd like to see value_iterators for MatrixWeighted? currently there is only DataWeight? iterators. This would allow manipulations of data in a MW object using many standard classes and functions. Is this possible to implement?

comment:6 in reply to:  5 Changed 12 years ago by Peter

Replying to jari:

I am not sure if this post belongs to this ticket.

I'd like to see value_iterators for MatrixWeighted? currently there is only DataWeight? iterators. This would allow manipulations of data in a MW object using many standard classes and functions. Is this possible to implement?

That feature is already available in form of the more generic adaptor DataIterator. You can for example write code such as:

copy_values(const Matrix& m, MatrixWeighted& mw)
{
   std::copy(m.begin(), m.end(), data_iterator(mw.begin()) );
}

Similarily, there is a WeightIterator that iterates over weights.

comment:7 Changed 12 years ago by Peter

Milestone: yat 0.x+yat 0.4
Resolution: fixed
Status: newclosed

iterators have been available (at least) since 0.4, so why is this ticket open?

Note: See TracTickets for help on using tickets.