changeset 28074:090964145c2f

maint: merge stable to default
author John W. Eaton <jwe@octave.org>
date Mon, 17 Feb 2020 14:27:39 -0500
parents c2a95ab0e94b (current diff) a3b40e48c069 (diff)
children 2bf76050cb75
files
diffstat 3 files changed, 43 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/octave-value/ov-classdef.cc	Mon Feb 17 12:43:53 2020 -0500
+++ b/libinterp/octave-value/ov-classdef.cc	Mon Feb 17 14:27:39 2020 -0500
@@ -204,6 +204,32 @@
   return octave_value ();
 }
 
+Matrix
+octave_classdef::size (void)
+{
+  octave::cdef_class cls = object.get_class ();
+
+  if (! in_class_method (cls) && ! called_from_builtin ())
+    {
+      octave::cdef_method meth = cls.find_method ("size");
+
+      if (meth.ok ())
+        {
+          count++;
+          octave_value_list args (1, octave_value (this));
+
+          octave_value_list lv = meth.execute (args, 1, true, "size");
+          if (lv.length () <= 0
+              || ! lv(0).is_matrix_type () || ! lv(0).dims ().isvector ())
+            error ("%s.size: invalid return value", class_name ().c_str ());
+
+          return lv(0).matrix_value ();
+        }
+    }
+
+  return octave_base_value::size ();
+}
+
 octave_idx_type
 octave_classdef::xnumel (const octave_value_list& idx)
 {
--- a/libinterp/octave-value/ov-classdef.h	Mon Feb 17 12:43:53 2020 -0500
+++ b/libinterp/octave-value/ov-classdef.h	Mon Feb 17 14:27:39 2020 -0500
@@ -113,6 +113,8 @@
                   const std::list<octave_value_list>& idx,
                   const octave_value& rhs);
 
+  Matrix size (void);
+
   octave_idx_type xnumel (const octave_value_list&);
 
   string_vector map_keys (void) const { return object.map_keys (); }
--- a/scripts/linear-algebra/bandwidth.m	Mon Feb 17 12:43:53 2020 -0500
+++ b/scripts/linear-algebra/bandwidth.m	Mon Feb 17 14:27:39 2020 -0500
@@ -40,7 +40,7 @@
 
 function [lower, upper] = bandwidth (A, type)
 
-  if (! ((nargin == 1 && nargout == 2) || (nargin == 2 && nargout <= 1)))
+  if (nargin < 1 || nargin > 2)
     print_usage ();
   endif
 
@@ -55,17 +55,17 @@
     if (isempty (i))
       lower = upper = 0;
     else
-      lower = max (i - j);
-      upper = max (j - i);
+      lower = max (0, max (i - j));
+      upper = max (0, max (j - i));
     endif
   else
     [i, j] = find (A);
     if (isempty (i))
       lower = 0;
     elseif (strcmp (type, "lower"))
-      lower = max (i - j);
+      lower = max (0, max (i - j));
     else
-      lower = max (j - i);
+      lower = max (0, max (j - i));
     endif
   endif
 
@@ -74,39 +74,42 @@
 
 %!test
 %! [a,b] = bandwidth (speye (100));
-%! assert ([a,b] == [0,0]);
+%! assert ([a,b], [0,0]);
 %! assert (bandwidth (speye (100), "upper"), 0);
 %! assert (bandwidth (speye (100), "lower"), 0);
 
 %!test
 %! A = [2 3 0 0 0; 1 2 3 0 0; 0 1 2 3 0; 0 0 1 2 3; 0 0 0 1 2];
 %! [a,b] = bandwidth (A);
-%! assert ([a,b] == [1,1]);
+%! assert ([a,b], [1,1]);
 %! assert (bandwidth (A, "lower"), 1);
 %! assert (bandwidth (A, "upper"), 1);
 
 %!assert (bandwidth ([], "lower"), 0)
 %!assert (bandwidth ([], "upper"), 0)
+%!assert (bandwidth ([]), 0)
 %!assert (bandwidth (zeros (3,3), "lower"), 0)
 %!assert (bandwidth (zeros (3,3), "upper"), 0)
+%!assert (bandwidth (zeros (3,3)), 0)
 %!assert (bandwidth (ones (5,5), "lower"), 4)
 %!assert (bandwidth (ones (5,5), "upper"), 4)
+%!assert (bandwidth (ones (5,5)), 4)
+
+%!assert (bandwidth ([0,1,2,0]), 0)
 
 %!test
 %! [a,b] = bandwidth ([]);
-%! assert ([a,b] == [0,0]);
+%! assert ([a,b], [0,0]);
 %!test
 %! [a,b] = bandwidth (zeros (3,3));
-%! assert ([a,b] == [0,0]);
+%! assert ([a,b], [0,0]);
 %!test
 %! [a,b] = bandwidth (ones (5,5));
-%! assert ([a,b] == [4,4]);
+%! assert ([a,b], [4,4]);
 
 ## Test input validation
 %!error bandwidth ()
 %!error bandwidth (1,2,3)
-%!error [a,b,c] = bandwidth (ones (2))
-%!error [a,b] = bandwidth (ones (2), "upper")
 %!error <A must be a 2-D numeric or logical> bandwidth ("string", "lower")
 %!error <A must be a 2-D numeric or logical> bandwidth (ones (3,3,3), "lower")
 %!error <TYPE must be "lower" or "upper"> bandwidth (ones (2), "uper")