changeset 31497:55f0173e4f08 stable

inv: Don't call LAPACK function *gecon if matrix contains NaN values (bug #63384). * liboctave/array/dMatrix (Matrix::finverse), liboctave/array/fMatrix.cc (FloatMatrix::finverse): Dont' call LAPACK function for calculation of condition number if matrix contains NaN values.
author Markus Mützel <markus.muetzel@gmx.de>
date Mon, 21 Nov 2022 18:15:03 +0100
parents 4cb81dcc5cc5
children e7bf202a2c89 e7b51b5b33f8
files liboctave/array/dMatrix.cc liboctave/array/fMatrix.cc
diffstat 2 files changed, 36 insertions(+), 26 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/array/dMatrix.cc	Wed Nov 16 23:07:58 2022 -0500
+++ b/liboctave/array/dMatrix.cc	Mon Nov 21 18:15:03 2022 +0100
@@ -596,19 +596,24 @@
     info = -1;
   else if (calc_cond)
     {
-      F77_INT dgecon_info = 0;
-
-      // Now calculate the condition number for non-singular matrix.
-      char job = '1';
-      Array<F77_INT> iz (dim_vector (nc, 1));
-      F77_INT *piz = iz.fortran_vec ();
-      F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nc, tmp_data, nr, anorm,
-                                 rcon, pz, piz, dgecon_info
-                                 F77_CHAR_ARG_LEN (1)));
-
-      if (dgecon_info != 0)
-        info = -1;
+      if (octave::math::isnan (anorm))
+        rcon = octave::numeric_limits<double>::NaN ();
+      else
+        {
+          F77_INT dgecon_info = 0;
+
+          // Now calculate the condition number for non-singular matrix.
+          char job = '1';
+          Array<F77_INT> iz (dim_vector (nc, 1));
+          F77_INT *piz = iz.fortran_vec ();
+          F77_XFCN (dgecon, DGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
+                                     nc, tmp_data, nr, anorm,
+                                     rcon, pz, piz, dgecon_info
+                                     F77_CHAR_ARG_LEN (1)));
+
+          if (dgecon_info != 0)
+            info = -1;
+        }
     }
 
   if (info == -1 && ! force)
--- a/liboctave/array/fMatrix.cc	Wed Nov 16 23:07:58 2022 -0500
+++ b/liboctave/array/fMatrix.cc	Mon Nov 21 18:15:03 2022 +0100
@@ -602,19 +602,24 @@
     info = -1;
   else if (calc_cond)
     {
-      F77_INT sgecon_info = 0;
-
-      // Now calculate the condition number for non-singular matrix.
-      char job = '1';
-      Array<F77_INT> iz (dim_vector (nc, 1));
-      F77_INT *piz = iz.fortran_vec ();
-      F77_XFCN (sgecon, SGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
-                                 nc, tmp_data, nr, anorm,
-                                 rcon, pz, piz, sgecon_info
-                                 F77_CHAR_ARG_LEN (1)));
-
-      if (sgecon_info != 0)
-        info = -1;
+      if (octave::math::isnan (anorm))
+        rcon = octave::numeric_limits<float>::NaN ();
+      else
+        {
+          F77_INT sgecon_info = 0;
+
+          // Now calculate the condition number for non-singular matrix.
+          char job = '1';
+          Array<F77_INT> iz (dim_vector (nc, 1));
+          F77_INT *piz = iz.fortran_vec ();
+          F77_XFCN (sgecon, SGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
+                                     nc, tmp_data, nr, anorm,
+                                     rcon, pz, piz, sgecon_info
+                                     F77_CHAR_ARG_LEN (1)));
+
+          if (sgecon_info != 0)
+            info = -1;
+        }
     }
 
   if (info == -1 && ! force)