# HG changeset patch # User Massimiliano Fasi # Date 1404547796 -7200 # Node ID 49961d67e4b950db36efaf5609de57ede59f142e # Parent 3d9e503aea2c9bcc9462cbfeef77a7671ec951e7 Add new matrix functions (isdiag, isbanded, istril, istriu) (bug #42688). * NEWS: Announce new functions. * scripts/linear-algebra/module.mk: Add new functions to build system. * scripts/linear-algebra/isdiag.m: New function. * scripts/linear-algebra/isbanded.m: New function. * scripts/linear-algebra/istril.m: New function. * scripts/linear-algebra/istriu.m: New function. * numbers.txi: Add new functions to manual. diff -r 3d9e503aea2c -r 49961d67e4b9 NEWS --- a/NEWS Mon Apr 14 22:53:44 2014 +0200 +++ b/NEWS Sat Jul 05 10:09:56 2014 +0200 @@ -56,11 +56,13 @@ ** Other new functions added in 4.2: - dir_in_loadpath numfields - hgload - hgsave - javachk - linkaxes + dir_in_loadpath javachk + hgload linkaxes + hgsave numfields + istril + istriu + isdiag + isbanded ** Deprecated functions. diff -r 3d9e503aea2c -r 49961d67e4b9 doc/interpreter/numbers.txi --- a/doc/interpreter/numbers.txi Mon Apr 14 22:53:44 2014 +0200 +++ b/doc/interpreter/numbers.txi Sat Jul 05 10:09:56 2014 +0200 @@ -811,6 +811,8 @@ @DOCSTRING(isnumeric) +@DOCSTRING(islogical) + @DOCSTRING(isfloat) @DOCSTRING(isreal) @@ -835,7 +837,13 @@ @DOCSTRING(isdefinite) -@DOCSTRING(islogical) +@DOCSTRING(isbanded) + +@DOCSTRING(isdiag) + +@DOCSTRING(istril) + +@DOCSTRING(istriu) @DOCSTRING(isprime) diff -r 3d9e503aea2c -r 49961d67e4b9 scripts/linear-algebra/isbanded.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/linear-algebra/isbanded.m Sat Jul 05 10:09:56 2014 +0200 @@ -0,0 +1,86 @@ +## 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} {} isbanded (@var{x}, @var{lower}, @var{upper}) +## Return true if @var{x} is a matrix with entries confined between +## @var{lower} diagonals below the main diagonal and @var{upper} diagonals +## above the main diagonal. +## +## @var{lower} and @var{upper} must be non-negative integers. +## @seealso{isdiag, istril, istriu} +## @end deftypefn + +## Author: Massimiliano Fasi + +function retval = isbanded (A, lower, upper) + + if (nargin != 3) + print_usage (); + endif + + if (! isreal (lower) || ! isreal (upper) || lower < 0 || upper < 0) + error ("isbanded: LOWER and UPPER must be non-negative integers"); + endif + + if (isempty (A)) + retval = []; + else + retval = (isnumeric (A) || islogical (A)) && ndims (A) == 2; + if (retval) + [i, j] = find (A); + pupp = j >= i; + retval = all (j(pupp) - i(pupp) <= upper); + if (retval) + plow = i >= j; + retval = all (i(plow) - j(plow) <= lower); + endif + endif + endif + +endfunction + + +%!assert (! isbanded ("string", 0, 0)) +%!assert (! isbanded (zeros (2,2,2), 0, 0)) +%!assert (isbanded ([], 0, 0)) +%!assert (isbanded (1,0,0)) +%!assert (isbanded (1,10,10)) + +%!assert (isbanded ([1, 1],1,1)) +%!assert (isbanded ([1; 1],1,1)) +%!assert (isbanded (eye(10),0,0)) +%!assert (isbanded (eye(10),1,1)) +%!assert (isbanded (i*eye(10),1,1)) +%!assert (isbanded (logical (eye (10)),1,1)) + +%! 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]; +%! assert (isbanded (A,1,1)) +%! assert (! isbanded (A,0,1)) +%! assert (! isbanded (A,1,0)) + +%% Test input validation +%!error isbanded () +%!error isbanded (1) +%!error isbanded (1,2) +%!error isbanded (1,2,3,4) +%!error isbanded (1, -1, 1) +%!error isbanded (1, 1, -1) +%!error isbanded (1, {1}, 1) +%!error isbanded (1, 1, {1}) + diff -r 3d9e503aea2c -r 49961d67e4b9 scripts/linear-algebra/isdiag.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/linear-algebra/isdiag.m Sat Jul 05 10:09:56 2014 +0200 @@ -0,0 +1,56 @@ +## 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} {} isdiag (@var{x}) +## Return true if @var{x} is a diagonal matrix. +## @seealso{isbanded, istril, istriu, diag} +## @end deftypefn + +## Author: Massimiliano Fasi + +function retval = isdiag (A) + + if (nargin != 1) + print_usage (); + endif + + retval = (isnumeric (A) || islogical (A)) && ndims (A) == 2; + if (retval) + [i, j] = find (A); + retval = all (i == j); + endif + +endfunction + + +%!assert (! isdiag ("string")) +%!assert (isdiag ([])) + +%!assert (isdiag (1)) +%!assert (! isdiag ([1, 1])) +%!assert (! isdiag ([1; 1])) +%!assert (isdiag (eye (10))) +%!assert (issymmetric ([i, 0; 0, 1 + i])) +%!assert (isdiag (speye (1000000))) +%!assert (isdiag (logical (eye (10)))) + +%% Test input validation +%!error isdiag () +%!error isdiag (1,2) + diff -r 3d9e503aea2c -r 49961d67e4b9 scripts/linear-algebra/istril.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/linear-algebra/istril.m Sat Jul 05 10:09:56 2014 +0200 @@ -0,0 +1,61 @@ +## 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} {} istril (@var{x}) +## Return true if @var{x} is a lower triangular matrix. +## +## A lower triangular matrix has nonzero entries only on the main diagonal +## and below. +## @seealso{istriu, isbanded, isdiag, tril} +## @end deftypefn + +## Author: Massimiliano Fasi + +function retval = istril (A) + + if (nargin != 1) + print_usage (); + endif + + retval = (isnumeric (A) || islogical (A)) && ndims (A) == 2; + if (retval) + [i, j] = find (A); + retval = all (i >= j); + endif + +endfunction + + +%!assert (! istril ("string")) +%!assert (istril ([])) +%!assert (! istril (zeros (2,2,2))) + +%!assert (istril (1)) +%!assert (! istril ([1, 1])) +%!assert (istril ([1; 1])) +%!assert (istril (eye (10))) +%!assert (istril (speye (100))) + +%!assert (istril (tril (randn (10)))) +%!assert (! istril (randn (10))) + +%% Test input validation +%!error istril () +%!error istril (1,2) + diff -r 3d9e503aea2c -r 49961d67e4b9 scripts/linear-algebra/istriu.m --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/scripts/linear-algebra/istriu.m Sat Jul 05 10:09:56 2014 +0200 @@ -0,0 +1,61 @@ +## 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} {} istriu (@var{x}) +## Return true if @var{x} is an upper triangular matrix. +## +## An upper triangular matrix has nonzero entries only on the main diagonal +## and above. +## @seealso{isdiag, isbanded, istril, triu} +## @end deftypefn + +## Author: Massimiliano Fasi + +function retval = istriu (A) + + if (nargin != 1) + print_usage (); + endif + + retval = (isnumeric (A) || islogical (A)) && ndims (A) == 2; + if (retval) + [i, j] = find (A); + retval = all (i <= j); + endif + +endfunction + + +%!assert (! istriu ("string")) +%!assert (istriu ([])) +%!assert (! istriu (zeros (2,2,2))) + +%!assert (istriu (1)) +%!assert (istriu ([1, 1])) +%!assert (! istriu ([1; 1])) +%!assert (istriu (eye (10))) +%!assert (istriu (speye (100))) + +%!assert (istriu (triu (randn (10)))) +%!assert (! istriu (randn (10))) + +%% Test input validation +%!error istriu () +%!error istriu (1,2) + diff -r 3d9e503aea2c -r 49961d67e4b9 scripts/linear-algebra/module.mk --- a/scripts/linear-algebra/module.mk Mon Apr 14 22:53:44 2014 +0200 +++ b/scripts/linear-algebra/module.mk Sat Jul 05 10:09:56 2014 +0200 @@ -8,9 +8,13 @@ linear-algebra/duplication_matrix.m \ linear-algebra/expm.m \ linear-algebra/housh.m \ + linear-algebra/isbanded.m \ linear-algebra/isdefinite.m \ + linear-algebra/isdiag.m \ linear-algebra/ishermitian.m \ linear-algebra/issymmetric.m \ + linear-algebra/istril.m \ + linear-algebra/istriu.m \ linear-algebra/krylov.m \ linear-algebra/linsolve.m \ linear-algebra/logm.m \