changeset 11242:0090bb47d0b5

simplify special case for concatenation of empty matrices
author John W. Eaton <jwe@octave.org>
date Fri, 12 Nov 2010 13:19:24 -0500
parents 80e01d79cf80
children dc5d1280ef14
files liboctave/Array.cc liboctave/ChangeLog src/data.cc
diffstat 3 files changed, 33 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/Array.cc	Thu Nov 11 14:53:26 2010 -0500
+++ b/liboctave/Array.cc	Fri Nov 12 13:19:24 2010 -0500
@@ -2537,49 +2537,47 @@
 
   // Special case:
   //
-  //   cat (dim, [], ..., [], A)
+  //   cat (dim, [], ..., [], A, ...)
   //
   // with dim > 2, A not 0x0, and at least three arguments to
-  // concatenate results in A.  Note that this check must be performed
-  // here because for full-on braindead Matlab compatibility, we need
-  // the above to succeed, but things like
+  // concatenate is equivalent to
+  //
+  //   cat (dim, A, ...)
+  //
+  // Note that this check must be performed here because for full-on
+  // braindead Matlab compatibility, we need to have things like
+  //
+  //   cat (3, [], [], A)
+  //
+  // succeed, but to have things like
   //
   //   cat (3, cat (3, [], []), A)
   //   cat (3, zeros (0, 0, 2), A)
   //
-  // to fail.  See also bug report #31615.
+  // fail.  See also bug report #31615.
+
+  octave_idx_type istart = 0;
 
   if (n > 2 && dim > 1)
     {
-      dim_vector dv = array_list[n-1].dims ();
-
-      if (! dv.zero_by_zero ())
+      for (octave_idx_type i = 0; i < n; i++)
         {
-          bool all_but_last_are_zero_by_zero = true;
-
-          if (all_but_last_are_zero_by_zero)
-            {
-              for (octave_idx_type i = 0; i < n-1; i++)
-                {
-                  dim_vector dv = array_list[i].dims ();
-
-                  if (! dv.zero_by_zero ())
-                    {
-                      all_but_last_are_zero_by_zero = false;
-                      break;
-                    }
-                }
-            }
-
-          if (all_but_last_are_zero_by_zero)
-            return array_list[n-1];
+          dim_vector dv = array_list[i].dims ();
+
+          if (dv.zero_by_zero ())
+            istart++;
+          else
+            break;
         }
+
+      // Don't skip any initial aguments if they are all empty.
+      if (istart >= n)
+        istart = 0;
     }
 
-
-  dim_vector dv = array_list[0].dims ();
-
-  for (octave_idx_type i = 1; i < n; i++)
+  dim_vector dv = array_list[istart++].dims ();
+
+  for (octave_idx_type i = istart; i < n; i++)
     if (! (dv.*concat_rule) (array_list[i].dims (), dim))
       (*current_liboctave_error_handler)
         ("cat: dimension mismatch");
--- a/liboctave/ChangeLog	Thu Nov 11 14:53:26 2010 -0500
+++ b/liboctave/ChangeLog	Fri Nov 12 13:19:24 2010 -0500
@@ -1,3 +1,7 @@
+2010-11-12  John W. Eaton  <jwe@octave.org>
+
+	* Array.cc (Array<T>::cat): Simplify previous change.
+
 2010-11-11  John W. Eaton  <jwe@octave.org>
 
 	* Array.cc (Array<T>::cat): New special case for concatenating
--- a/src/data.cc	Thu Nov 11 14:53:26 2010 -0500
+++ b/src/data.cc	Fri Nov 12 13:19:24 2010 -0500
@@ -1890,6 +1890,7 @@
 %!assert (cat (3, [], [1,2;3,4], []), [1,2;3,4]);
 %!assert (cat (3, [], [], []), zeros (0, 0, 3));
 
+%!assert (cat (3, [], [], 1, 2), cat (3, 1, 2));
 %!assert (cat (3, [], [], [1,2;3,4]), [1,2;3,4]);
 %!assert (cat (4, [], [], [1,2;3,4]), [1,2;3,4]);
 %!error <dimension mismatch> cat (3, cat (3, [], []), [1,2;3,4]);