changeset 5940:0dd8428bb260

[project @ 2006-08-18 17:50:23 by jwe]
author jwe
date Fri, 18 Aug 2006 17:50:23 +0000
parents 2e86e3601e0f
children 117052c2b53c
files liboctave/Array.cc liboctave/ChangeLog
diffstat 2 files changed, 45 insertions(+), 37 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/Array.cc
+++ b/liboctave/Array.cc
@@ -515,49 +515,52 @@
 
   retval.resize (dv_new);
 
-  Array<octave_idx_type> cp (nd+1, 1);
-  for (octave_idx_type i = 1; i < nd+1; i++)
-    cp(i) = cp(i-1) * dv(i-1);
-
-  octave_idx_type incr = cp(perm_vec(0));
-
-  Array<octave_idx_type> base_delta (nd-1, 0);
-  Array<octave_idx_type> base_delta_max (nd-1);
-  Array<octave_idx_type> base_incr (nd-1);
-  for (octave_idx_type i = 0; i < nd-1; i++)
+  if (numel () > 0)
     {
-      base_delta_max(i) = dv_new(i+1);
-      base_incr(i) = cp(perm_vec(i+1));
-    }
-
-  octave_idx_type nr_new = dv_new(0);
-  octave_idx_type nel_new = dv_new.numel ();
-  octave_idx_type n = nel_new / nr_new;
-
-  octave_idx_type k = 0;
-
-  for (octave_idx_type i = 0; i < n; i++)
-    {
-      octave_idx_type iidx = 0;
-      for (octave_idx_type kk = 0; kk < nd-1; kk++)
-	iidx += base_delta(kk) * base_incr(kk);
-
-      for (octave_idx_type j = 0; j < nr_new; j++)
+      Array<octave_idx_type> cp (nd+1, 1);
+      for (octave_idx_type i = 1; i < nd+1; i++)
+	cp(i) = cp(i-1) * dv(i-1);
+
+      octave_idx_type incr = cp(perm_vec(0));
+
+      Array<octave_idx_type> base_delta (nd-1, 0);
+      Array<octave_idx_type> base_delta_max (nd-1);
+      Array<octave_idx_type> base_incr (nd-1);
+      for (octave_idx_type i = 0; i < nd-1; i++)
 	{
-	  OCTAVE_QUIT;
-
-	  retval(k++) = elem(iidx);
-	  iidx += incr;
+	  base_delta_max(i) = dv_new(i+1);
+	  base_incr(i) = cp(perm_vec(i+1));
 	}
 
-      base_delta(0)++;
-
-      for (octave_idx_type kk = 0; kk < nd-2; kk++)
+      octave_idx_type nr_new = dv_new(0);
+      octave_idx_type nel_new = dv_new.numel ();
+      octave_idx_type n = nel_new / nr_new;
+
+      octave_idx_type k = 0;
+
+      for (octave_idx_type i = 0; i < n; i++)
 	{
-	  if (base_delta(kk) == base_delta_max(kk))
+	  octave_idx_type iidx = 0;
+	  for (octave_idx_type kk = 0; kk < nd-1; kk++)
+	    iidx += base_delta(kk) * base_incr(kk);
+
+	  for (octave_idx_type j = 0; j < nr_new; j++)
 	    {
-	      base_delta(kk) = 0;
-	      base_delta(kk+1)++;
+	      OCTAVE_QUIT;
+
+	      retval(k++) = elem(iidx);
+	      iidx += incr;
+	    }
+
+	  base_delta(0)++;
+
+	  for (octave_idx_type kk = 0; kk < nd-2; kk++)
+	    {
+	      if (base_delta(kk) == base_delta_max(kk))
+		{
+		  base_delta(kk) = 0;
+		  base_delta(kk+1)++;
+		}
 	    }
 	}
     }
--- a/liboctave/ChangeLog
+++ b/liboctave/ChangeLog
@@ -1,3 +1,8 @@
+2006-08-18  John W. Eaton  <jwe@octave.org>
+
+	* Array.cc (Array<T>::permute): Only rearrange values if array is
+	not empty.
+
 2006-07-26  John W. Eaton  <jwe@octave.org>
 
 	* dbleDET.cc (DET::initialize10, DET::value_will_underflow,