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 ()
 */