Mercurial > hg > octave-lyh
diff liboctave/idx-vector.cc @ 10512:aac9f4265048
rewrite sparse indexed assignment
author | Jaroslav Hajek <highegg@gmail.com> |
---|---|
date | Tue, 13 Apr 2010 12:36:21 +0200 |
parents | 077fef5da460 |
children | f0266ee4aabe |
line wrap: on
line diff
--- a/liboctave/idx-vector.cc +++ b/liboctave/idx-vector.cc @@ -1154,6 +1154,40 @@ } idx_vector +idx_vector::inverse_permutation (octave_idx_type n) const +{ + assert (n == length (n)); + + idx_vector retval; + + switch (idx_class ()) + { + case class_range: + { + if (increment () == -1) + retval = sorted (); + else + retval = *this; + break; + } + case class_vector: + { + idx_vector_rep *r = dynamic_cast<idx_vector_rep *> (rep); + const octave_idx_type *ri = r->get_data (); + Array<octave_idx_type> idx (orig_dimensions ()); + for (octave_idx_type i = 0; i < n; i++) + idx.xelem(ri[i]) = i; + retval = new idx_vector_rep (idx, r->extent (0), DIRECT); + } + default: + retval = *this; + break; + } + + return retval; +} + +idx_vector idx_vector::unmask (void) const { if (idx_class () == class_mask)