# HG changeset patch # User John W. Eaton # Date 1581967659 18000 # Node ID 090964145c2fc480003374887f30e45634a1542c # Parent c2a95ab0e94b02979cbb788d96d716d5b912ed7c# Parent a3b40e48c0697652751d178c8c75a66ce979f956 maint: merge stable to default diff -r c2a95ab0e94b -r 090964145c2f libinterp/octave-value/ov-classdef.cc --- 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) { diff -r c2a95ab0e94b -r 090964145c2f libinterp/octave-value/ov-classdef.h --- 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& 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 (); } diff -r c2a95ab0e94b -r 090964145c2f scripts/linear-algebra/bandwidth.m --- 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 bandwidth ("string", "lower") %!error bandwidth (ones (3,3,3), "lower") %!error bandwidth (ones (2), "uper")