Mercurial > jwe > octave
changeset 28115:91f245908132
allow K to be out of range in tril and triu functions
* tril.cc (do_trilu): For compatibility with Matlab, if K is out of
range, set it to the limiting value instead of throwing an error.
Update tests.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 19 Feb 2020 12:45:09 -0500 |
parents | 42892c93bd25 |
children | 7fa1d6f670f5 |
files | libinterp/corefcn/tril.cc |
diffstat | 1 files changed, 41 insertions(+), 12 deletions(-) [+] |
line wrap: on
line diff
--- a/libinterp/corefcn/tril.cc Wed Feb 19 08:57:13 2020 -0800 +++ b/libinterp/corefcn/tril.cc Wed Feb 19 12:45:09 2020 -0500 @@ -209,8 +209,10 @@ dim_vector dims = arg.dims (); if (dims.ndims () != 2) error ("%s: need a 2-D matrix", name.c_str ()); - else if (k < -dims(0) || k > dims(1)) - error ("%s: requested diagonal out of range", name.c_str ()); + else if (k < -dims(0)) + k = -dims(0); + else if (k > dims(1)) + k = dims(1); octave_value retval; @@ -428,24 +430,51 @@ } /* -%!test +%!shared a, l2, l1, l0, lm1, lm2, lm3, lm4 %! a = [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12]; %! -%! l0 = [1, 0, 0; 4, 5, 0; 7, 8, 9; 10, 11, 12]; +%! l2 = [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12]; %! l1 = [1, 2, 0; 4, 5, 6; 7, 8, 9; 10, 11, 12]; -%! l2 = [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12]; +%! l0 = [1, 0, 0; 4, 5, 0; 7, 8, 9; 10, 11, 12]; %! lm1 = [0, 0, 0; 4, 0, 0; 7, 8, 0; 10, 11, 12]; %! lm2 = [0, 0, 0; 0, 0, 0; 7, 0, 0; 10, 11, 0]; %! lm3 = [0, 0, 0; 0, 0, 0; 0, 0, 0; 10, 0, 0]; %! lm4 = [0, 0, 0; 0, 0, 0; 0, 0, 0; 0, 0, 0]; %! -%! assert (tril (a, -4), lm4); -%! assert (tril (a, -3), lm3); -%! assert (tril (a, -2), lm2); -%! assert (tril (a, -1), lm1); -%! assert (tril (a), l0); -%! assert (tril (a, 1), l1); -%! assert (tril (a, 2), l2); +%!assert (tril (a, 3), l2); +%!assert (tril (a, 2), l2); +%!assert (tril (a, 1), l1); +%!assert (tril (a, 0), l0); +%!assert (tril (a), l0); +%!assert (tril (a, -1), lm1); +%!assert (tril (a, -2), lm2); +%!assert (tril (a, -3), lm3); +%!assert (tril (a, -4), lm4); +%!assert (tril (a, -5), lm4); + +%!shared a, u3, u2, u1, u0, um1, um2, um3 +%! +%! a = [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12]; +%! +%! u3 = [0, 0, 0; 0, 0, 0; 0, 0, 0; 0, 0, 0]; +%! u2 = [0, 0, 3; 0, 0, 0; 0, 0, 0; 0, 0, 0]; +%! u1 = [0, 2, 3; 0, 0, 6; 0, 0, 0; 0, 0, 0]; +%! u0 = [1, 2, 3; 0, 5, 6; 0, 0, 9; 0, 0, 0]; +%! um1 = [1, 2, 3; 4, 5, 6; 0, 8, 9; 0, 0, 12]; +%! um2 = [1, 2, 3; 4, 5, 6; 7, 8, 9; 0, 11, 12]; +%! um3 = [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12]; +%! +%!assert (triu (a, 4), u3); +%!assert (triu (a, 3), u3); +%!assert (triu (a, 2), u2); +%!assert (triu (a, 1), u1); +%!assert (triu (a, 0), u0); +%!assert (triu (a), u0); +%!assert (triu (a, -1), um1); +%!assert (triu (a, -2), um2); +%!assert (triu (a, -3), um3); +%!assert (triu (a, -4), um3); %!error tril () +%!error triu () */