# HG changeset patch # User John W. Eaton # Date 1289505206 18000 # Node ID 80e01d79cf807c14f557549a999d8ccc3cfe664c # Parent b19cfcd6a5c74a33b2e5282a46ee3f8ed6a7660c special case for concatenation of empty matrices diff --git a/liboctave/Array.cc b/liboctave/Array.cc --- a/liboctave/Array.cc +++ b/liboctave/Array.cc @@ -2535,6 +2535,48 @@ else if (n == 0) return Array (); + // 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++) diff --git a/liboctave/ChangeLog b/liboctave/ChangeLog --- a/liboctave/ChangeLog +++ b/liboctave/ChangeLog @@ -1,3 +1,8 @@ +2010-11-11 John W. Eaton + + * Array.cc (Array::cat): New special case for concatenating + empty matrices. Bug #31615. + 2010-11-11 John W. Eaton * lo-mappers.cc (xtrunc, xround): Move definitions here from diff --git a/src/ChangeLog b/src/ChangeLog --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,7 @@ +2010-11-11 John W. Eaton + + * data.cc: New tests for cat. Enable 4 asserts that were disabled. + 2010-11-11 Kai Habel * fltk-backend.cc (plot_window::uimenu_update, diff --git a/src/data.cc b/src/data.cc --- a/src/data.cc +++ b/src/data.cc @@ -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 cat (3, cat (3, [], []), [1,2;3,4]); +%!error cat (3, zeros (0, 0, 2), [1,2;3,4]); */