|
Ublas : |
Subject: Re: [ublas] poll: what's your uBLAS I/O usage ?
From: Rutger ter Borg (rutger_at_[hidden])
Date: 2010-06-03 03:45:47
Hey Jesse,
> I think that for now, it is reasonable to expect an in memory copy for
> non-contiguous data (or column-major). So perhaps I can get iterators
> on the data which would work for strides > 1? Is there a bindings method
> to get a generic iterator that I could use for std::copy to a contiguous
> chunk of memory? Is this what the linear_iterator is for? If so, how do
> I get it for an arbitrary matrix and vector? I couldn't figure out the
> right combination of tags/etc.
the linear_iterator is meant to work with any linear memory layout, i.e.,
these
http://en.wikipedia.org/wiki/Array_data_structure#Multidimensional_arrays
I think the following works, also for any kind of view, in pseudo code,
some_matrix M;
begin( column( M, i ) ) ... end( column( M, i ) )
begin( row( M, i ) ) ... end( row( M, i ) )
but what's defunctional at the moment is double-nested loop-stuff, i.e., an
iterator that doesn't return a pointer to data but iterates over
rows/columns,
begin_row( M ) ... end_row( M ) |r| {
begin( r ) ... end( r )
}
then, once this works, we could take it one step further, to assure that the
inner loop contains contiguous blocks of data,
begin_major( M ) ... end_major( M ) |vec| {
... do stuff with begin_value / end_value of vec; contiguous data
}
> My basic strategy would be:
> 1) If stride > 1 for either dimension, then do a std::copy with generic
> iterators.
> 2) If storage ordering is column major, then do a transpose. (order with 1
> could be reversed depending on what trans() does)
> 3) Write the data with the API, then free the allocated memory
Perhaps I am missing something, but don't we also need resizing capabilities
to be able to make stuff work with I/O?
> Am I missing something here when I think that storing the trans of a
> fortran ordered matrix (of arbitrary strides) with an API that expects C
> storage will end up correct in matlab?
Sounds right to me.
> Thanks. I was kind of confused with the begin() and end() for matrices
> and exactly what I should be passing for the tags. And I wasn't sure if
> these returned an iterator throw rows/columns or pointers to the
> underlying
> data storage. Any hints for this?
Hopefully the above answers this piece.
> I couldn't figure out what the trans() did exactly. Can I:
> 1) trans() my structure if column major
> 2) Ask it for a linear iterator to go through the data and do my copy?
> With the linear iterator now going through in the right order?
Trans flips all necessary strides/sizes and stuff so that it seems you are
dealing with a transposed matrix. So what you say should work,
begin( column( trans( M ), i ) ) ... end( column( trans( M ), i ) )
begin( row( trans( M ), i ) ) ... end( row( trans( M ), i ) )
> Thanks for your help. Hopefully this can be a test case for the bindings.
Thanks for the feedback! I'm quite busy with other stuff right now, I've put
the iterator stuff on the todo-list.
Cheers,
Rutger