changeset 29075:dc3ee9616267 stable

eigs.m: Fix error message when second input is empty matrix (bug #59486) * eigs.m: Declare b matrix to null matrix at start of input validation. When a B matrix is detected, do further decoding to see if it is empty. Rename "tmp" variable to "arg" in input validation for readability. Check whether b matrix is empty to decide how to call eig() function. Add BIST test for bug #59486.
author Rik <rik@octave.org>
date Thu, 19 Nov 2020 13:05:51 -0800
parents c6796a1c35b2
children fa2cdef14442 90a8e6fd85c3
files scripts/sparse/eigs.m
diffstat 1 files changed, 36 insertions(+), 25 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/sparse/eigs.m	Wed Nov 18 19:44:46 2020 -0800
+++ b/scripts/sparse/eigs.m	Thu Nov 19 13:05:51 2020 -0800
@@ -211,15 +211,21 @@
 
   call_eig = false;
   offset = 0;
+  b = [];
   k = 6;
   sigma = "lm";
 
   if (isnumeric (varargin{1}) && issquare (varargin{1}))
     a = varargin{1};
-    if (nargin > 1 && isnumeric (varargin{2})
-        && issquare (varargin{2}) && size_equal (a, varargin{2}))
-      b = varargin{2};
-      offset = 1;
+    if (nargin > 1 && isnumeric (varargin{2}))
+      if (size_equal (a, varargin{2}))
+        b = varargin{2};
+        offset = 1;
+      elseif (isempty (varargin{2}))
+        ## Special syntax to do regular eigenvalue decomposition rather
+        ## than generalized eigenvalue decomposition (B = []).
+        offset = 1;
+      endif
     endif
 
     if (rows (a) < 13)
@@ -227,13 +233,13 @@
     endif
 
     if (nargin > 1 + offset)
-      tmp = varargin{2+offset};
-      if (isnumeric (tmp) && isscalar (tmp) && isreal (tmp)
-          && round (tmp) == tmp)
-        k = tmp;
+      arg = varargin{2+offset};
+      if (isnumeric (arg) && isscalar (arg) && isreal (arg)
+          && fix (arg) == arg)
+        k = arg;
         p = 2 * k;
-      elseif (isfield (tmp, "p"))
-          p = tmp.p;
+      elseif (isfield (arg, "p"))
+        p = arg.p;
       endif
       if (p >= rows (a))
         call_eig = true;
@@ -242,13 +248,13 @@
       endif
 
       if (nargin > 2 + offset)
-        tmp = varargin{3+offset};
-        if (ischar (tmp))
-          sigma = tolower (tmp);
-        elseif (isnumeric (tmp) && isscalar (tmp))
-          sigma = tmp;
-        elseif (isfield (tmp, "p"))
-          p = tmp.p;
+        arg = varargin{3+offset};
+        if (ischar (arg))
+          sigma = tolower (arg);
+        elseif (isnumeric (arg) && isscalar (arg))
+          sigma = arg;
+        elseif (isfield (arg, "p"))
+          p = arg.p;
         endif
         if (p >= rows (a))
           call_eig = true;
@@ -257,9 +263,9 @@
         endif
       endif
       if (nargin > 3 + offset)
-        tmp = varargin{4+offset};
-        if (isfield (tmp, "p"))
-          p = tmp.p;
+        arg = varargin{4+offset};
+        if (isfield (arg, "p"))
+          p = arg.p;
         else
           p = 2 * k;
         endif
@@ -274,14 +280,14 @@
 
   if (call_eig)
     varargout = cell (1, min (2, max (1, nargout)));
-    if (offset)
+    if (isempty (b))
+      real_valued = isreal (a);
+      symmetric = issymmetric (a);
+      [varargout{:}] = eig (a);
+    else
       real_valued = isreal (a) && isreal (b);
       symmetric = issymmetric (a) && issymmetric (b);
       [varargout{:}] = eig (a, b);
-    else
-      real_valued = isreal (a);
-      symmetric = issymmetric (a);
-      [varargout{:}] = eig (a);
     endif
     varargout = select (varargout, k, sigma, real_valued, symmetric);
     if (nargout == 3)
@@ -1579,3 +1585,8 @@
 %! assert (isreal (d));
 %! [~, d] = eigs (A);
 %! assert (isreal (d));
+
+%!testif HAVE_ARPACK <*59486>
+%! A = magic (5);
+%! d = eigs (A, [], 1);
+%! assert (d, 65, 150*eps);