changeset 11241:80e01d79cf80

special case for concatenation of empty matrices
author John W. Eaton <jwe@octave.org>
date Thu, 11 Nov 2010 14:53:26 -0500
parents b19cfcd6a5c7
children 0090bb47d0b5
files liboctave/Array.cc liboctave/ChangeLog src/ChangeLog src/data.cc
diffstat 4 files changed, 60 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/Array.cc	Thu Nov 11 14:53:11 2010 -0500
+++ b/liboctave/Array.cc	Thu Nov 11 14:53:26 2010 -0500
@@ -2535,6 +2535,48 @@
   else if (n == 0)
     return Array<T> ();
 
+  // Special case:
+  //
+  //   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
+  //
+  //   cat (3, cat (3, [], []), A)
+  //   cat (3, zeros (0, 0, 2), A)
+  //
+  // to fail.  See also bug report #31615.
+
+  if (n > 2 && dim > 1)
+    {
+      dim_vector dv = array_list[n-1].dims ();
+
+      if (! dv.zero_by_zero ())
+        {
+          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[0].dims ();
 
   for (octave_idx_type i = 1; i < n; i++)
--- a/liboctave/ChangeLog	Thu Nov 11 14:53:11 2010 -0500
+++ b/liboctave/ChangeLog	Thu Nov 11 14:53:26 2010 -0500
@@ -1,3 +1,8 @@
+2010-11-11  John W. Eaton  <jwe@octave.org>
+
+	* Array.cc (Array<T>::cat): New special case for concatenating
+	empty matrices.  Bug #31615.
+
 2010-11-11  John W. Eaton  <jwe@octave.org>
 
 	* lo-mappers.cc (xtrunc, xround): Move definitions here from
--- a/src/ChangeLog	Thu Nov 11 14:53:11 2010 -0500
+++ b/src/ChangeLog	Thu Nov 11 14:53:26 2010 -0500
@@ -1,3 +1,7 @@
+2010-11-11  John W. Eaton  <jwe@octave.org>
+
+	* data.cc: New tests for cat.  Enable 4 asserts that were disabled.
+
 2010-11-11  Kai Habel  <kai.habel@gmx.de>
 
 	* fltk-backend.cc (plot_window::uimenu_update,
--- a/src/data.cc	Thu Nov 11 14:53:11 2010 -0500
+++ b/src/data.cc	Thu Nov 11 14:53:26 2010 -0500
@@ -1885,10 +1885,15 @@
 %!assert (testcat('uint64', 'single', 'uint64', false));
 %!assert (testcat('uint64', 'uint64', 'uint64', false));
 
-%! assert (cat (3, [], [1,2;3,4]), [1,2;3,4]);
-%! assert (cat (3, [1,2;3,4], []), [1,2;3,4]);
-%! assert (cat (3, [], [1,2;3,4], []), [1,2;3,4]);
-%! assert (cat (3, [], [], []), zeros (0, 0, 3));
+%!assert (cat (3, [], [1,2;3,4]), [1,2;3,4]);
+%!assert (cat (3, [1,2;3,4], []), [1,2;3,4]);
+%!assert (cat (3, [], [1,2;3,4], []), [1,2;3,4]);
+%!assert (cat (3, [], [], []), zeros (0, 0, 3));
+
+%!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]);
+%!error <dimension mismatch> cat (3, zeros (0, 0, 2), [1,2;3,4]);
 
 */