Mercurial > hg > octave-terminal
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 +++ b/liboctave/Array.cc @@ -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 +++ b/liboctave/ChangeLog @@ -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 +++ b/src/ChangeLog @@ -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 +++ 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 <dimension mismatch> cat (3, cat (3, [], []), [1,2;3,4]); +%!error <dimension mismatch> cat (3, zeros (0, 0, 2), [1,2;3,4]); */