cerenoc wrote:
I am trying a reasonably simple operation of
assigning a vector v(2) to a submatrix (3,3). For example, in matlab
notation:
m =
0 1 2
3 4 5
6 7 8
v =
15 16
m(2, 1:2) = v
resulting in:
m =
0 1 2
15 16 5
6 7 8
What is the best way to do this with ublas? [...]
========================================
#include <iostream>
#include
#include
#include
using std::cin;
using std::cout;
using std::endl;
namespace ublas = boost::numeric::ublas;
int main() {
cout << endl;
ublas::matrix<double> m;
cout << "m -> ";
// input is: [3,3]((0,1,2),(3,4,5),(6,7,8))
cin >> m;
cout << m << endl;
cout << endl;
ublas::vector<double> v;
cout << "v -> ";
// input is: [2](15,16)
cin >> v;
cout << v << endl;
cout << endl;
project (row (m, 1), ublas::range (0, 2)) = v;
cout << endl;
cout << m << endl;
cout << endl;
}
========================================
Essential line is:
project (row (m, 1), ublas::range (0, 2)) = v;
`row (m, r)' extracts r-th row (that is, row with index `r') of `m'.
Extracted row has type `matrix_row<M>' which is a subtype
of `vector_expression<E>' (which can be thought of as
a kind of a vector).
Now, to extract first and second element (i.e. elements
with indices 0 and 1) from the row, one can use
`project' function
project (vct, ublas::range (first, beyond))
This function extracts from `vct' a vector range (with the
type `vector_range<V>') from 'first' to, but not including,
`beyond' -- this is similar to iterator ranges.
Another function which can be used is
project (vct, ublas::slice (first, step, num))
This function forms a vector slice (type `vector_slice<V>')
with `num' elements starting at the element with index `first'
and increasing indices by `step'; e.g.
project (vct, ublas::slice (3, 2, 4))
will form vector slice containing elements which have
indices 3,5,7,9 in `vct'. In your example, this will be
project (row (m, 1), ublas::slice (0, 1, 2));
There are some shortcuts, too:
m[1](ublas::range (0,2))
m.row(1)(ublas::range (0,2))
Sincerely,
fres