changeset 29738:5928dd4f7a02 stable

logm.m: Fix check for real negative values in complex vector (bug #60738). * scripts/linear-algebra/logm.m: Fix check for real negative values in complex vector. Add BIST.
author Markus Mützel <markus.muetzel@gmx.de>
date Mon, 07 Jun 2021 11:48:51 +0200
parents 906b7d0b6d98
children d2909c4ffd62 35389a23d09a
files scripts/linear-algebra/logm.m
diffstat 1 files changed, 9 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/linear-algebra/logm.m	Sun Jun 06 12:51:23 2021 -0400
+++ b/scripts/linear-algebra/logm.m	Mon Jun 07 11:48:51 2021 +0200
@@ -75,12 +75,13 @@
   endif
 
   eigv = diag (s);
-  if (any (eigv < 0))
+  real_neg_eigv = (real (eigv) < 0) & (imag (eigv) == 0);
+  if (any (real_neg_eigv))
     warning ("Octave:logm:non-principal",
              "logm: principal matrix logarithm is not defined for matrices with negative eigenvalues; computing non-principal logarithm");
   endif
 
-  real_eig = all (eigv >= 0);
+  real_eig = ! any (real_neg_eigv);
 
   k = 0;
   ## Algorithm 11.9 in "Function of matrices", by N. Higham
@@ -180,6 +181,12 @@
 %!assert (full (logm (eye (3))), logm (full (eye (3))))
 %!assert (full (logm (10*eye (3))), logm (full (10*eye (3))), 8*eps)
 %!assert (logm (expm ([0 1i; -1i 0])), [0 1i; -1i 0], 10 * eps)
+%!test <*60738>
+%! A = [0.2510, 1.2808, -1.2252; ...
+%!      0.2015, 1.0766, 0.5630; ...
+%!      -1.9769, -1.0922, -0.5831];
+%! warning ("off", "Octave:logm:non-principal", "local");
+%! assert (expm (logm (A)), A, 40*eps);
 
 ## Test input validation
 %!error logm ()