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	Mon Apr 12 18:07:58 2010 -0400
+++ b/liboctave/idx-vector.cc	Tue Apr 13 12:36:21 2010 +0200
@@ -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)