diff liboctave/Array.cc @ 4593:77566be8b9e9

[project @ 2003-11-11 17:25:42 by jwe]
author jwe
date Tue, 11 Nov 2003 17:25:42 +0000
parents a97b498e1b32
children f2cd320cbf6e
line wrap: on
line diff
--- a/liboctave/Array.cc
+++ b/liboctave/Array.cc
@@ -356,6 +356,71 @@
 }
 
 template <class T>
+Array<T>
+Array<T>::permute (const Array<int>& perm_vec, bool inv) const
+{
+  Array<T> retval;
+
+  dim_vector dv = dims ();
+  dim_vector dv_new;
+
+  int nd = dv.length ();
+
+  dv_new.resize (nd);
+
+  // Need this array to check for identical elements in permutation array.
+  Array<bool> checked (nd, false);
+
+  // Find dimension vector of permuted array.
+  for (int i = 0; i < nd; i++)
+    {
+      int perm_el = perm_vec.elem (i);
+
+      if (perm_el > dv.length () || perm_el < 1)
+	{
+	  (*current_liboctave_error_handler)
+	    ("permutation vector contains an invalid element");
+
+	  return retval;
+	}
+
+      if (checked.elem(perm_el - 1))
+	{
+	  (*current_liboctave_error_handler)
+	    ("PERM cannot contain identical elements");
+
+	  return retval;
+	}
+      else
+	checked.elem(perm_el - 1) = true;
+
+      dv_new (i) = dv (perm_el - 1);
+    }
+
+  retval.resize (dv_new);
+
+  // Index array to the original array.
+  Array<int> old_idx (nd, 0);
+
+  // Number of elements in Array (should be the same for
+  // both the permuted array and original array).
+  int n = retval.length ();
+
+  // Permute array.
+  for (int i = 0; i < n; i++)
+    {
+      // Get the idx of permuted array.
+      Array<int> new_idx = calc_permutated_idx (old_idx, perm_vec, inv);
+
+      retval.elem (new_idx) = elem (old_idx);
+
+      increment_index (old_idx, dv);
+    }
+
+  return retval;
+}
+
+template <class T>
 void
 Array<T>::resize_no_fill (int n)
 {