sub-vectors and sub-matrices
It is possible to obtain any sub-vector or sub-matrix of a fully interfaced object. There are four types of sub indexes.
gmm::sub_interval(first, length);
represents an interval whose first index is first and length is length ( for instance gmm::sub_interval(10, 3); represents the indexes {10, 11, 12} ).
gmm::sub_slice(first, length, step);
represents also an interval in which one index over step is taken. ( for instance gmm::sub_slice(10, 3, 2); represents the indexes {10, 12, 14} )
gmm::sub_index(CONT c);
represents the sub-index which is the collection of index contained in the container c. For instance
std::vector<size_t> c(3); c[0] = 1; c[1] = 3; c[2] = 16; gmm::sub_index(c);
represents the indexes {1, 3, 16}
.
VERY IMPORTANT : the container c has to be sorted from the smaller
index to the greater one (i.e. with increasing order) and no
repetition is allowed.
For unsorted index such as permutation, a special type of sub index
is defined:
gmm::unsorted_sub_index(CONT c);
Some algorithms are a little bit slower with unsorted sub indexes.
Now gmm::sub_vector(V, subi) gives a reference to a sub-vector:
gmm::vsvector<double> V(10); V[5] = 3.0; std::cout << gmm::sub_vector(V, gmm::sub_interval(2, 3)) << std::endl;
prints to the standard output V[2],
V[3] and V[4].
gmm::sub_matrix(V, subi1, subi2) gives a
reference to a sub-matrix. For instance:
gmm::col_matrix< gmm::wsvector<double> > M(5, 20);
M(3, 2) = 5.0;
std::cout << gmm::sub_matrix(M, gmm::sub_interval(2, 3), gmm::sub_interval(2, 3))
<< std::endl;
prints to the output a sub-matrix. If the two sub-indexes are equal, it is possible to omit the second. For instance:
gmm::col_matrix< gmm::wsvector<double> > M(5, 20); M(3, 2) = 5.0; std::cout << gmm::sub_matrix(V, gmm::sub_interval(2, 3)) << std::endl;
The reference on sub_matrix is writable if the corresponding matrix is writable (so you can copy on a sub_matrix, add sub-matrices ...).
