changeset 18900:49961d67e4b9

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.
author Massimiliano Fasi <massimiliano.fasi@gmail.com>
date Sat, 05 Jul 2014 10:09:56 +0200
parents 3d9e503aea2c
children df972b9d080a
files NEWS doc/interpreter/numbers.txi scripts/linear-algebra/isbanded.m scripts/linear-algebra/isdiag.m scripts/linear-algebra/istril.m scripts/linear-algebra/istriu.m scripts/linear-algebra/module.mk
diffstat 7 files changed, 284 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- 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.
 
--- 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)
 
--- /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
+## <http://www.gnu.org/licenses/>.
+
+## -*- 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 <LOWER and UPPER must be non-negative> isbanded (1, -1, 1)
+%!error <LOWER and UPPER must be non-negative> isbanded (1, 1, -1)
+%!error <LOWER and UPPER must be non-negative> isbanded (1, {1}, 1)
+%!error <LOWER and UPPER must be non-negative> isbanded (1, 1, {1})
+
--- /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
+## <http://www.gnu.org/licenses/>.
+
+## -*- 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)
+
--- /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
+## <http://www.gnu.org/licenses/>.
+
+## -*- 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)
+
--- /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
+## <http://www.gnu.org/licenses/>.
+
+## -*- 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)
+
--- 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 \