diff liboctave/Sparse.cc @ 6813:75d99621f850

[project @ 2007-08-14 17:14:18 by jwe]
author jwe
date Tue, 14 Aug 2007 17:14:19 +0000
parents 8e0444d90050
children 8c89a644df8a
line wrap: on
line diff
--- a/liboctave/Sparse.cc
+++ b/liboctave/Sparse.cc
@@ -780,46 +780,28 @@
 Sparse<T>
 Sparse<T>::permute (const Array<octave_idx_type>& perm_vec, bool) const
 {
-  dim_vector dv = dims ();
-  dim_vector dv_new;
-
-  octave_idx_type 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 (octave_idx_type i = 0; i < nd; i++)
+  // The only valid permutations of a sparse array are [1, 2] and [2, 1].
+
+  bool fail = false;
+  bool transpose = false;
+
+  if (perm_vec.length () == 2)
     {
-      octave_idx_type 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 Sparse<T> ();
-	}
-
-      if (checked.elem(perm_el - 1))
-	{
-	  (*current_liboctave_error_handler)
-	    ("PERM cannot contain identical elements");
-
-	  return Sparse<T> ();
-	}
+      if (perm_vec(0) == 0 && perm_vec(1) == 1)
+	/* do nothing */;
+      else if (perm_vec(0) == 1 && perm_vec(1) == 0)
+	transpose = true;
       else
-	checked.elem(perm_el - 1) = true;
-
-      dv_new (i) = dv (perm_el - 1);
+	fail = true;
     }
-
-  if (dv_new == dv)
-    return *this;
   else
-    return transpose ();
+    fail = true;
+
+  if (fail)
+    (*current_liboctave_error_handler)
+      ("permutation vector contains an invalid element");
+
+  return transpose ? this->transpose () : *this;
 }
 
 template <class T>