# HG changeset patch # User Markus Mützel # Date 1669050903 -3600 # Node ID 55f0173e4f0800c0c293bdca6dde914de162a613 # Parent 4cb81dcc5cc587e2efdbcb57da1cd7a225a8bd32 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. diff -r 4cb81dcc5cc5 -r 55f0173e4f08 liboctave/array/dMatrix.cc --- 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 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::NaN (); + else + { + F77_INT dgecon_info = 0; + + // Now calculate the condition number for non-singular matrix. + char job = '1'; + Array 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) diff -r 4cb81dcc5cc5 -r 55f0173e4f08 liboctave/array/fMatrix.cc --- 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 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::NaN (); + else + { + F77_INT sgecon_info = 0; + + // Now calculate the condition number for non-singular matrix. + char job = '1'; + Array 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)