# HG changeset patch # User Massimiliano Fasi # Date 1404814777 -7200 # Node ID 9addb5ad942650d5995cf10c5c7b20c635fa3206 # Parent 93805f9256a94500dce3c2c0d8eadd270e575f4e bandwidth.m: Add new function. * NEWS: Announce new function. * scripts/linear-algebra/module.mk: New function added to the build system. * scripts/help/__unimplemented__.m: New function removed from unimplemented. * scripts/linear-algebra/isbanded.m: New function added as documentation reference. * scripts/linear-algebra/isdiag.m: New function added as documentation reference. * scripts/linear-algebra/istril.m: New function added as documentation reference. * scripts/linear-algebra/istriu.m: New function added as documentation reference. * scripts/linear-algebra/bandwidth.m: New function. * linalg.txi: Add bandwidth function to manual. diff -r 93805f9256a9 -r 9addb5ad9426 NEWS --- a/NEWS Tue Jul 08 20:45:50 2014 +0100 +++ b/NEWS Tue Jul 08 12:19:37 2014 +0200 @@ -56,13 +56,10 @@ ** Other new functions added in 4.2: - dir_in_loadpath javachk - hgload linkaxes - hgsave numfields - istril - istriu - isdiag - isbanded + bandwidth isbanded javachk + dir_in_loadpath isdiag linkaxes + hgload istril numfields + hgsave istriu ** Deprecated functions. diff -r 93805f9256a9 -r 9addb5ad9426 doc/interpreter/linalg.txi --- a/doc/interpreter/linalg.txi Tue Jul 08 20:45:50 2014 +0100 +++ b/doc/interpreter/linalg.txi Tue Jul 08 12:19:37 2014 +0200 @@ -96,6 +96,8 @@ @DOCSTRING(balance) +@DOCSTRING(bandwidth) + @DOCSTRING(cond) @DOCSTRING(det) diff -r 93805f9256a9 -r 9addb5ad9426 scripts/help/__unimplemented__.m --- a/scripts/help/__unimplemented__.m Tue Jul 08 20:45:50 2014 +0100 +++ b/scripts/help/__unimplemented__.m Tue Jul 08 12:19:37 2014 +0200 @@ -103,7 +103,7 @@ ## control system case {"absorbDelay", "allmargin", "append", "augstate", "balreal", ... - "balred", "balredOptions", "bandwidth", "bdschur", "bode", ... + "balred", "balredOptions", "bdschur", "bode", ... "bodemag", "bodeoptions", "bodeplot", "c2d", "c2dOptions", ... "canon", "care", "chgFreqUnit", "chgTimeUnit", "connect", ... "connectOptions", "covar", "ctrb", "ctrbf", "ctrlpref", "d2c", ... diff -r 93805f9256a9 -r 9addb5ad9426 scripts/linear-algebra/bandwidth.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/linear-algebra/bandwidth.m Tue Jul 08 12:19:37 2014 +0200 @@ -0,0 +1,110 @@ +## Copyright (C) 2014 Massimiliano Fasi +## +## This file is part of Octave. +## +## Octave is free software; you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or (at +## your option) any later version. +## +## Octave is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with Octave; see the file COPYING. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{bw} =} bandwidth (@var{A}, @var{type}) +## @deftypefnx {Function File} {[@var{lower}, @var{upper}] =} bandwidth (@var{A}) +## Compute the bandwidth of @var{A}. +## +## The @var{type} argument is the string @qcode{"lower"} for the lower +## bandwidth and @qcode{"upper"} for the upper bandwidth. +## If no @var{type} is specified return both the lower and upper bandwidth +## of @var{A}. +## +## The lower/upper bandwidth of a matrix is the number of +## subdiagonals/superdiagonals with nonzero entries. +## +## @seealso{isbanded, isdiag, istril, istriu} +## @end deftypefn + +## Author: Massimiliano Fasi + +function [lower, upper] = bandwidth (A, type) + + if (! ((nargin == 1 && nargout == 2) || (nargin == 2 && nargout <= 1))) + print_usage (); + endif + + if (! isnumeric (A) && ! islogical (A) || ndims (A) != 2) + error ("bandwidth: A must be a 2-D numeric or logical matrix"); + elseif (nargin == 2 && ! (strcmp (type, "lower") || strcmp (type, "upper"))) + error ('bandwidth: TYPE must be "lower" or "upper"'); + endif + + if (nargin == 1) + [i, j] = find (A); + if (isempty (i)) + lower = upper = 0; + else + lower = max (i - j); + upper = max (j - i); + endif + else + [i, j] = find (A); + if (isempty (i)) + lower = 0; + elseif (strcmp (type, "lower")) + lower = max (i - j); + else + lower = max (j - i); + endif + endif + +endfunction + + +%!test +%! [a,b] = bandwidth (speye (100)); +%! 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 (bandwidth (A, "lower"), 1); +%! assert (bandwidth (A, "upper"), 1); + +%!assert (bandwidth ([], "lower"), 0) +%!assert (bandwidth ([], "upper"), 0) +%!assert (bandwidth (zeros (3,3), "lower"), 0) +%!assert (bandwidth (zeros (3,3), "upper"), 0) +%!assert (bandwidth (ones (5,5), "lower"), 4) +%!assert (bandwidth (ones (5,5), "upper"), 4) + +%!test +%! [a,b] = bandwidth ([]); +%! assert ([a,b] == [0,0]); +%!test +%! [a,b] = bandwidth (zeros (3,3)); +%! assert ([a,b] == [0,0]); +%!test +%! [a,b] = bandwidth (ones (5,5)); +%! 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") +%!error bandwidth (ones (2), "uppper") + diff -r 93805f9256a9 -r 9addb5ad9426 scripts/linear-algebra/isbanded.m --- a/scripts/linear-algebra/isbanded.m Tue Jul 08 20:45:50 2014 +0100 +++ b/scripts/linear-algebra/isbanded.m Tue Jul 08 12:19:37 2014 +0200 @@ -23,7 +23,7 @@ ## above the main diagonal. ## ## @var{lower} and @var{upper} must be non-negative integers. -## @seealso{isdiag, istril, istriu} +## @seealso{isdiag, istril, istriu, bandwidth} ## @end deftypefn ## Author: Massimiliano Fasi diff -r 93805f9256a9 -r 9addb5ad9426 scripts/linear-algebra/isdiag.m --- a/scripts/linear-algebra/isdiag.m Tue Jul 08 20:45:50 2014 +0100 +++ b/scripts/linear-algebra/isdiag.m Tue Jul 08 12:19:37 2014 +0200 @@ -19,7 +19,7 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {} isdiag (@var{x}) ## Return true if @var{x} is a diagonal matrix. -## @seealso{isbanded, istril, istriu, diag} +## @seealso{isbanded, istril, istriu, diag, bandwidth} ## @end deftypefn ## Author: Massimiliano Fasi diff -r 93805f9256a9 -r 9addb5ad9426 scripts/linear-algebra/istril.m --- a/scripts/linear-algebra/istril.m Tue Jul 08 20:45:50 2014 +0100 +++ b/scripts/linear-algebra/istril.m Tue Jul 08 12:19:37 2014 +0200 @@ -22,7 +22,7 @@ ## ## A lower triangular matrix has nonzero entries only on the main diagonal ## and below. -## @seealso{istriu, isbanded, isdiag, tril} +## @seealso{istriu, isbanded, isdiag, tril, bandwidth} ## @end deftypefn ## Author: Massimiliano Fasi diff -r 93805f9256a9 -r 9addb5ad9426 scripts/linear-algebra/istriu.m --- a/scripts/linear-algebra/istriu.m Tue Jul 08 20:45:50 2014 +0100 +++ b/scripts/linear-algebra/istriu.m Tue Jul 08 12:19:37 2014 +0200 @@ -22,7 +22,7 @@ ## ## An upper triangular matrix has nonzero entries only on the main diagonal ## and above. -## @seealso{isdiag, isbanded, istril, triu} +## @seealso{isdiag, isbanded, istril, triu, bandwidth} ## @end deftypefn ## Author: Massimiliano Fasi diff -r 93805f9256a9 -r 9addb5ad9426 scripts/linear-algebra/module.mk --- a/scripts/linear-algebra/module.mk Tue Jul 08 20:45:50 2014 +0100 +++ b/scripts/linear-algebra/module.mk Tue Jul 08 12:19:37 2014 +0200 @@ -1,6 +1,7 @@ FCN_FILE_DIRS += linear-algebra linear_algebra_FCN_FILES = \ + linear-algebra/bandwidth.m \ linear-algebra/commutation_matrix.m \ linear-algebra/cond.m \ linear-algebra/condest.m \