comparison scripts/linear-algebra/bandwidth.m @ 28073:a3b40e48c069 stable

bandwidth: allow nargout == 1 when TYPE is not specified * bandwidth: Don't check nargout when validating argument list, just require 1 or two arguments. Update tests.
author John W. Eaton <jwe@octave.org>
date Mon, 17 Feb 2020 14:16:58 -0500
parents a4268efb7334
children 28de41192f3c 0a5b15007766
comparison
equal deleted inserted replaced
28072:47238792de58 28073:a3b40e48c069
38 ## @seealso{isbanded, isdiag, istril, istriu} 38 ## @seealso{isbanded, isdiag, istril, istriu}
39 ## @end deftypefn 39 ## @end deftypefn
40 40
41 function [lower, upper] = bandwidth (A, type) 41 function [lower, upper] = bandwidth (A, type)
42 42
43 if (! ((nargin == 1 && nargout == 2) || (nargin == 2 && nargout <= 1))) 43 if (nargin < 1 || nargin > 2)
44 print_usage (); 44 print_usage ();
45 endif 45 endif
46 46
47 if (! isnumeric (A) && ! islogical (A) || ndims (A) != 2) 47 if (! isnumeric (A) && ! islogical (A) || ndims (A) != 2)
48 error ("bandwidth: A must be a 2-D numeric or logical matrix"); 48 error ("bandwidth: A must be a 2-D numeric or logical matrix");
53 if (nargin == 1) 53 if (nargin == 1)
54 [i, j] = find (A); 54 [i, j] = find (A);
55 if (isempty (i)) 55 if (isempty (i))
56 lower = upper = 0; 56 lower = upper = 0;
57 else 57 else
58 lower = max (i - j); 58 lower = max (0, max (i - j));
59 upper = max (j - i); 59 upper = max (0, max (j - i));
60 endif 60 endif
61 else 61 else
62 [i, j] = find (A); 62 [i, j] = find (A);
63 if (isempty (i)) 63 if (isempty (i))
64 lower = 0; 64 lower = 0;
65 elseif (strcmp (type, "lower")) 65 elseif (strcmp (type, "lower"))
66 lower = max (i - j); 66 lower = max (0, max (i - j));
67 else 67 else
68 lower = max (j - i); 68 lower = max (0, max (j - i));
69 endif 69 endif
70 endif 70 endif
71 71
72 endfunction 72 endfunction
73 73
74 74
75 %!test 75 %!test
76 %! [a,b] = bandwidth (speye (100)); 76 %! [a,b] = bandwidth (speye (100));
77 %! assert ([a,b] == [0,0]); 77 %! assert ([a,b], [0,0]);
78 %! assert (bandwidth (speye (100), "upper"), 0); 78 %! assert (bandwidth (speye (100), "upper"), 0);
79 %! assert (bandwidth (speye (100), "lower"), 0); 79 %! assert (bandwidth (speye (100), "lower"), 0);
80 80
81 %!test 81 %!test
82 %! 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]; 82 %! 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];
83 %! [a,b] = bandwidth (A); 83 %! [a,b] = bandwidth (A);
84 %! assert ([a,b] == [1,1]); 84 %! assert ([a,b], [1,1]);
85 %! assert (bandwidth (A, "lower"), 1); 85 %! assert (bandwidth (A, "lower"), 1);
86 %! assert (bandwidth (A, "upper"), 1); 86 %! assert (bandwidth (A, "upper"), 1);
87 87
88 %!assert (bandwidth ([], "lower"), 0) 88 %!assert (bandwidth ([], "lower"), 0)
89 %!assert (bandwidth ([], "upper"), 0) 89 %!assert (bandwidth ([], "upper"), 0)
90 %!assert (bandwidth ([]), 0)
90 %!assert (bandwidth (zeros (3,3), "lower"), 0) 91 %!assert (bandwidth (zeros (3,3), "lower"), 0)
91 %!assert (bandwidth (zeros (3,3), "upper"), 0) 92 %!assert (bandwidth (zeros (3,3), "upper"), 0)
93 %!assert (bandwidth (zeros (3,3)), 0)
92 %!assert (bandwidth (ones (5,5), "lower"), 4) 94 %!assert (bandwidth (ones (5,5), "lower"), 4)
93 %!assert (bandwidth (ones (5,5), "upper"), 4) 95 %!assert (bandwidth (ones (5,5), "upper"), 4)
96 %!assert (bandwidth (ones (5,5)), 4)
97
98 %!assert (bandwidth ([0,1,2,0]), 0)
94 99
95 %!test 100 %!test
96 %! [a,b] = bandwidth ([]); 101 %! [a,b] = bandwidth ([]);
97 %! assert ([a,b] == [0,0]); 102 %! assert ([a,b], [0,0]);
98 %!test 103 %!test
99 %! [a,b] = bandwidth (zeros (3,3)); 104 %! [a,b] = bandwidth (zeros (3,3));
100 %! assert ([a,b] == [0,0]); 105 %! assert ([a,b], [0,0]);
101 %!test 106 %!test
102 %! [a,b] = bandwidth (ones (5,5)); 107 %! [a,b] = bandwidth (ones (5,5));
103 %! assert ([a,b] == [4,4]); 108 %! assert ([a,b], [4,4]);
104 109
105 ## Test input validation 110 ## Test input validation
106 %!error bandwidth () 111 %!error bandwidth ()
107 %!error bandwidth (1,2,3) 112 %!error bandwidth (1,2,3)
108 %!error [a,b,c] = bandwidth (ones (2))
109 %!error [a,b] = bandwidth (ones (2), "upper")
110 %!error <A must be a 2-D numeric or logical> bandwidth ("string", "lower") 113 %!error <A must be a 2-D numeric or logical> bandwidth ("string", "lower")
111 %!error <A must be a 2-D numeric or logical> bandwidth (ones (3,3,3), "lower") 114 %!error <A must be a 2-D numeric or logical> bandwidth (ones (3,3,3), "lower")
112 %!error <TYPE must be "lower" or "upper"> bandwidth (ones (2), "uper") 115 %!error <TYPE must be "lower" or "upper"> bandwidth (ones (2), "uper")
113 %!error <TYPE must be "lower" or "upper"> bandwidth (ones (2), "uppper") 116 %!error <TYPE must be "lower" or "upper"> bandwidth (ones (2), "uppper")