diff liboctave/fCMatrix.cc @ 7797:f42c6f8d6d8e

Extend rcond function to single precision types
author David Bateman <dbateman@free.fr>
date Wed, 14 May 2008 23:28:41 +0200
parents 82be108cc558
children a0c550b22e61
line wrap: on
line diff
--- a/liboctave/fCMatrix.cc
+++ b/liboctave/fCMatrix.cc
@@ -961,45 +961,45 @@
 FloatComplexMatrix::inverse (void) const
 {
   octave_idx_type info;
-  float rcond;
+  float rcon;
   MatrixType mattype (*this);
-  return inverse (mattype, info, rcond, 0, 0);
+  return inverse (mattype, info, rcon, 0, 0);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::inverse (octave_idx_type& info) const
 {
-  float rcond;
+  float rcon;
   MatrixType mattype (*this);
-  return inverse (mattype, info, rcond, 0, 0);
+  return inverse (mattype, info, rcon, 0, 0);
 }
 
 FloatComplexMatrix
-FloatComplexMatrix::inverse (octave_idx_type& info, float& rcond, int force,
+FloatComplexMatrix::inverse (octave_idx_type& info, float& rcon, int force,
 			int calc_cond) const
 {
   MatrixType mattype (*this);
-  return inverse (mattype, info, rcond, force, calc_cond);
+  return inverse (mattype, info, rcon, force, calc_cond);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::inverse (MatrixType &mattype) const
 {
   octave_idx_type info;
-  float rcond;
-  return inverse (mattype, info, rcond, 0, 0);
+  float rcon;
+  return inverse (mattype, info, rcon, 0, 0);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::inverse (MatrixType &mattype, octave_idx_type& info) const
 {
-  float rcond;
-  return inverse (mattype, info, rcond, 0, 0);
+  float rcon;
+  return inverse (mattype, info, rcon, 0, 0);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::tinverse (MatrixType &mattype, octave_idx_type& info,
-			 float& rcond, int force, int calc_cond) const
+			 float& rcon, int force, int calc_cond) const
 {
   FloatComplexMatrix retval;
 
@@ -1023,7 +1023,7 @@
 				 F77_CHAR_ARG_LEN (1)));
 
       // Throw-away extra info LAPACK gives so as to not change output.
-      rcond = 0.0;
+      rcon = 0.0;
       if (info != 0) 
 	info = -1;
       else if (calc_cond) 
@@ -1037,7 +1037,7 @@
 	  F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&job, 1),
 				     F77_CONST_CHAR_ARG2 (&uplo, 1),
 				     F77_CONST_CHAR_ARG2 (&udiag, 1),
-				     nr, tmp_data, nr, rcond, 
+				     nr, tmp_data, nr, rcon, 
 				     cwork, rwork, ztrcon_info 
 				     F77_CHAR_ARG_LEN (1)
 				     F77_CHAR_ARG_LEN (1)
@@ -1056,7 +1056,7 @@
 
 FloatComplexMatrix
 FloatComplexMatrix::finverse (MatrixType &mattype, octave_idx_type& info,
-			 float& rcond, int force, int calc_cond) const
+			 float& rcon, int force, int calc_cond) const
 {
   FloatComplexMatrix retval;
 
@@ -1096,7 +1096,7 @@
       F77_XFCN (cgetrf, CGETRF, (nc, nc, tmp_data, nr, pipvt, info));
 
       // Throw-away extra info LAPACK gives so as to not change output.
-      rcond = 0.0;
+      rcon = 0.0;
       if (info != 0) 
 	info = -1;
       else if (calc_cond) 
@@ -1108,7 +1108,7 @@
 	  float *prz = rz.fortran_vec ();
 	  F77_XFCN (cgecon, CGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
 				     nc, tmp_data, nr, anorm, 
-				     rcond, pz, prz, zgecon_info
+				     rcon, pz, prz, zgecon_info
 				     F77_CHAR_ARG_LEN (1)));
 
 	  if (zgecon_info != 0) 
@@ -1137,7 +1137,7 @@
 
 FloatComplexMatrix
 FloatComplexMatrix::inverse (MatrixType &mattype, octave_idx_type& info,
-			float& rcond, int force, int calc_cond) const
+			float& rcon, int force, int calc_cond) const
 {
   int typ = mattype.type (false);
   FloatComplexMatrix ret;
@@ -1146,7 +1146,7 @@
     typ = mattype.type (*this);
 
   if (typ == MatrixType::Upper || typ == MatrixType::Lower)
-    ret = tinverse (mattype, info, rcond, force, calc_cond);
+    ret = tinverse (mattype, info, rcon, force, calc_cond);
   else
     {
       if (mattype.is_hermitian ())
@@ -1155,9 +1155,9 @@
 	  if (info == 0)
 	    {
 	      if (calc_cond)
-		rcond = chol.rcond();
+		rcon = chol.rcond();
 	      else
-		rcond = 1.0;
+		rcon = 1.0;
 	      ret = chol.inverse ();
 	    }
 	  else
@@ -1165,9 +1165,9 @@
 	}
 
       if (!mattype.is_hermitian ())
-	ret = finverse(mattype, info, rcond, force, calc_cond);
-
-      if ((mattype.is_hermitian () || calc_cond) && rcond == 0.)
+	ret = finverse(mattype, info, rcon, force, calc_cond);
+
+      if ((mattype.is_hermitian () || calc_cond) && rcon == 0.)
 	ret = FloatComplexMatrix (rows (), columns (), FloatComplex (octave_Float_Inf, 0.));
     }
 
@@ -1531,19 +1531,19 @@
 FloatComplexMatrix::determinant (void) const
 {
   octave_idx_type info;
-  float rcond;
-  return determinant (info, rcond, 0);
+  float rcon;
+  return determinant (info, rcon, 0);
 }
 
 FloatComplexDET
 FloatComplexMatrix::determinant (octave_idx_type& info) const
 {
-  float rcond;
-  return determinant (info, rcond, 0);
+  float rcon;
+  return determinant (info, rcon, 0);
 }
 
 FloatComplexDET
-FloatComplexMatrix::determinant (octave_idx_type& info, float& rcond, int calc_cond) const
+FloatComplexMatrix::determinant (octave_idx_type& info, float& rcon, int calc_cond) const
 {
   FloatComplexDET retval;
 
@@ -1572,7 +1572,7 @@
       F77_XFCN (cgetrf, CGETRF, (nr, nc, tmp_data, nr, pipvt, info));
 
       // Throw-away extra info LAPACK gives so as to not change output.
-      rcond = 0.0;
+      rcon = 0.0;
       if (info != 0) 
 	{
 	  info = -1;
@@ -1591,7 +1591,7 @@
 
 	      F77_XFCN (cgecon, CGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
 					 nc, tmp_data, nr, anorm, 
-					 rcond, pz, prz, info
+					 rcon, pz, prz, info
 					 F77_CHAR_ARG_LEN (1)));
 	    }
 
@@ -1636,9 +1636,176 @@
   return retval;
 }
 
+float
+FloatComplexMatrix::rcond (void) const
+{
+  MatrixType mattype (*this);
+  return rcond (mattype);
+}
+
+float
+FloatComplexMatrix::rcond (MatrixType &mattype) const
+{
+  float rcon;
+  octave_idx_type nr = rows ();
+  octave_idx_type nc = cols ();
+
+  if (nr != nc)
+    (*current_liboctave_error_handler) ("matrix must be square");
+  else if (nr == 0 || nc == 0)
+    rcon = octave_Inf;
+  else
+    {
+      int typ = mattype.type ();
+
+      if (typ == MatrixType::Unknown)
+	typ = mattype.type (*this);
+
+      // Only calculate the condition number for LU/Cholesky
+      if (typ == MatrixType::Upper)
+	{
+	  const FloatComplex *tmp_data = fortran_vec ();
+	  octave_idx_type info = 0;
+	  char norm = '1';
+	  char uplo = 'U';
+	  char dia = 'N';
+
+	  Array<FloatComplex> z (2 * nc);
+	  FloatComplex *pz = z.fortran_vec ();
+	  Array<float> rz (nc);
+	  float *prz = rz.fortran_vec ();
+
+	  F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
+				     F77_CONST_CHAR_ARG2 (&uplo, 1), 
+				     F77_CONST_CHAR_ARG2 (&dia, 1), 
+				     nr, tmp_data, nr, rcon,
+				     pz, prz, info
+				     F77_CHAR_ARG_LEN (1)
+				     F77_CHAR_ARG_LEN (1)
+				     F77_CHAR_ARG_LEN (1)));
+
+	  if (info != 0) 
+	    rcon = 0;
+	}
+      else if  (typ == MatrixType::Permuted_Upper)
+	(*current_liboctave_error_handler)
+	  ("permuted triangular matrix not implemented");
+      else if (typ == MatrixType::Lower)
+	{
+	  const FloatComplex *tmp_data = fortran_vec ();
+	  octave_idx_type info = 0;
+	  char norm = '1';
+	  char uplo = 'L';
+	  char dia = 'N';
+
+	  Array<FloatComplex> z (2 * nc);
+	  FloatComplex *pz = z.fortran_vec ();
+	  Array<float> rz (nc);
+	  float *prz = rz.fortran_vec ();
+
+	  F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
+				     F77_CONST_CHAR_ARG2 (&uplo, 1), 
+				     F77_CONST_CHAR_ARG2 (&dia, 1), 
+				     nr, tmp_data, nr, rcon,
+				     pz, prz, info
+				     F77_CHAR_ARG_LEN (1)
+				     F77_CHAR_ARG_LEN (1)
+				     F77_CHAR_ARG_LEN (1)));
+
+	  if (info != 0) 
+	    rcon = 0.0;
+	}
+      else if (typ == MatrixType::Permuted_Lower)
+	(*current_liboctave_error_handler)
+	  ("permuted triangular matrix not implemented");
+      else if (typ == MatrixType::Full || typ == MatrixType::Hermitian)
+	{
+	  float anorm = -1.0;
+	  FloatComplexMatrix atmp = *this;
+	  FloatComplex *tmp_data = atmp.fortran_vec ();
+
+	  if (typ == MatrixType::Hermitian)
+	    {
+	      octave_idx_type info = 0;
+	      char job = 'L';
+	      anorm = atmp.abs().sum().
+		row(static_cast<octave_idx_type>(0)).max();
+
+	      F77_XFCN (cpotrf, CPOTRF, (F77_CONST_CHAR_ARG2 (&job, 1), nr, 
+					 tmp_data, nr, info
+					 F77_CHAR_ARG_LEN (1)));
+
+	      if (info != 0) 
+		{
+		  rcon = 0.0;
+
+		  mattype.mark_as_unsymmetric ();
+		  typ = MatrixType::Full;
+		}
+	      else 
+		{
+		  Array<FloatComplex> z (2 * nc);
+		  FloatComplex *pz = z.fortran_vec ();
+		  Array<float> rz (nc);
+		  float *prz = rz.fortran_vec ();
+
+		  F77_XFCN (cpocon, CPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
+					     nr, tmp_data, nr, anorm,
+					     rcon, pz, prz, info
+					     F77_CHAR_ARG_LEN (1)));
+
+		  if (info != 0) 
+		    rcon = 0.0;
+		}
+	    }
+
+
+	  if (typ == MatrixType::Full)
+	    {
+	      octave_idx_type info = 0;
+
+	      Array<octave_idx_type> ipvt (nr);
+	      octave_idx_type *pipvt = ipvt.fortran_vec ();
+
+	      if(anorm < 0.)
+		anorm = atmp.abs().sum().
+		  row(static_cast<octave_idx_type>(0)).max();
+
+	      Array<FloatComplex> z (2 * nc);
+	      FloatComplex *pz = z.fortran_vec ();
+	      Array<float> rz (2 * nc);
+	      float *prz = rz.fortran_vec ();
+
+	      F77_XFCN (cgetrf, CGETRF, (nr, nr, tmp_data, nr, pipvt, info));
+
+	      if (info != 0) 
+		{ 
+		  rcon = 0.0;
+		  mattype.mark_as_rectangular ();
+		} 
+	      else 
+		{
+		  char job = '1';
+		  F77_XFCN (cgecon, CGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
+					     nc, tmp_data, nr, anorm, 
+					     rcon, pz, prz, info
+					     F77_CHAR_ARG_LEN (1)));
+
+		  if (info != 0) 
+		    rcon = 0.0;
+		}
+	    }
+	}
+      else
+	rcon = 0.0;
+    }
+
+  return rcon;
+}
+
 FloatComplexMatrix
 FloatComplexMatrix::utsolve (MatrixType &mattype, const FloatComplexMatrix& b, 
-			octave_idx_type& info, float& rcond, 
+			octave_idx_type& info, float& rcon, 
 			solve_singularity_handler sing_handler,
 			bool calc_cond) const
 {
@@ -1660,7 +1827,7 @@
 	  typ == MatrixType::Upper)
 	{
 	  octave_idx_type b_nc = b.cols ();
-	  rcond = 1.;
+	  rcon = 1.;
 	  info = 0;
 
 	  if (typ == MatrixType::Permuted_Upper)
@@ -1686,7 +1853,7 @@
 		  F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
 					     F77_CONST_CHAR_ARG2 (&uplo, 1), 
 					     F77_CONST_CHAR_ARG2 (&dia, 1), 
-					     nr, tmp_data, nr, rcond,
+					     nr, tmp_data, nr, rcon,
 					     pz, prz, info
 					     F77_CHAR_ARG_LEN (1)
 					     F77_CHAR_ARG_LEN (1)
@@ -1695,18 +1862,18 @@
 		  if (info != 0) 
 		    info = -2;
 
-		  volatile float rcond_plus_one = rcond + 1.0;
-
-		  if (rcond_plus_one == 1.0 || xisnan (rcond))
+		  volatile float rcond_plus_one = rcon + 1.0;
+
+		  if (rcond_plus_one == 1.0 || xisnan (rcon))
 		    {
 		      info = -2;
 
 		      if (sing_handler)
-			sing_handler (rcond);
+			sing_handler (rcon);
 		      else
 			(*current_liboctave_error_handler)
 			  ("matrix singular to machine precision, rcond = %g",
-			   rcond);
+			   rcon);
 		    }
 		}
 
@@ -1739,7 +1906,7 @@
 
 FloatComplexMatrix
 FloatComplexMatrix::ltsolve (MatrixType &mattype, const FloatComplexMatrix& b, 
-			octave_idx_type& info, float& rcond, 
+			octave_idx_type& info, float& rcon, 
 			solve_singularity_handler sing_handler,
 			bool calc_cond) const
 {
@@ -1761,7 +1928,7 @@
 	  typ == MatrixType::Lower)
 	{
 	  octave_idx_type b_nc = b.cols ();
-	  rcond = 1.;
+	  rcon = 1.;
 	  info = 0;
 
 	  if (typ == MatrixType::Permuted_Lower)
@@ -1787,7 +1954,7 @@
 		  F77_XFCN (ctrcon, CTRCON, (F77_CONST_CHAR_ARG2 (&norm, 1), 
 					     F77_CONST_CHAR_ARG2 (&uplo, 1), 
 					     F77_CONST_CHAR_ARG2 (&dia, 1), 
-					     nr, tmp_data, nr, rcond,
+					     nr, tmp_data, nr, rcon,
 					     pz, prz, info
 					     F77_CHAR_ARG_LEN (1)
 					     F77_CHAR_ARG_LEN (1)
@@ -1796,18 +1963,18 @@
 		  if (info != 0) 
 		    info = -2;
 
-		  volatile float rcond_plus_one = rcond + 1.0;
-
-		  if (rcond_plus_one == 1.0 || xisnan (rcond))
+		  volatile float rcond_plus_one = rcon + 1.0;
+
+		  if (rcond_plus_one == 1.0 || xisnan (rcon))
 		    {
 		      info = -2;
 
 		      if (sing_handler)
-			sing_handler (rcond);
+			sing_handler (rcon);
 		      else
 			(*current_liboctave_error_handler)
 			  ("matrix singular to machine precision, rcond = %g",
-			   rcond);
+			   rcon);
 		    }
 		}
 
@@ -1840,7 +2007,7 @@
 
 FloatComplexMatrix
 FloatComplexMatrix::fsolve (MatrixType &mattype, const FloatComplexMatrix& b, 
-		       octave_idx_type& info, float& rcond,
+		       octave_idx_type& info, float& rcon,
 		       solve_singularity_handler sing_handler,
 		       bool calc_cond) const
 {
@@ -1875,7 +2042,7 @@
 				     F77_CHAR_ARG_LEN (1)));
 
 	  // Throw-away extra info LAPACK gives so as to not change output.
-	  rcond = 0.0;
+	  rcon = 0.0;
 	  if (info != 0) 
 	    {
 	      info = -2;
@@ -1894,24 +2061,24 @@
 
 		  F77_XFCN (cpocon, CPOCON, (F77_CONST_CHAR_ARG2 (&job, 1),
 					     nr, tmp_data, nr, anorm,
-					     rcond, pz, prz, info
+					     rcon, pz, prz, info
 					     F77_CHAR_ARG_LEN (1)));
 
 		  if (info != 0) 
 		    info = -2;
 
-		  volatile float rcond_plus_one = rcond + 1.0;
-
-		  if (rcond_plus_one == 1.0 || xisnan (rcond))
+		  volatile float rcond_plus_one = rcon + 1.0;
+
+		  if (rcond_plus_one == 1.0 || xisnan (rcon))
 		    {
 		      info = -2;
 
 		      if (sing_handler)
-			sing_handler (rcond);
+			sing_handler (rcon);
 		      else
 			(*current_liboctave_error_handler)
 			  ("matrix singular to machine precision, rcond = %g",
-			   rcond);
+			   rcon);
 		    }
 		}
 
@@ -1957,13 +2124,13 @@
 	  F77_XFCN (cgetrf, CGETRF, (nr, nr, tmp_data, nr, pipvt, info));
 
 	  // Throw-away extra info LAPACK gives so as to not change output.
-	  rcond = 0.0;
+	  rcon = 0.0;
 	  if (info != 0) 
 	    { 
 	      info = -2;
 
 	      if (sing_handler)
-		sing_handler (rcond);
+		sing_handler (rcon);
 	      else
 		(*current_liboctave_error_handler)
 		  ("matrix singular to machine precision");
@@ -1979,24 +2146,24 @@
 		  char job = '1';
 		  F77_XFCN (cgecon, CGECON, (F77_CONST_CHAR_ARG2 (&job, 1),
 					     nc, tmp_data, nr, anorm, 
-					     rcond, pz, prz, info
+					     rcon, pz, prz, info
 					     F77_CHAR_ARG_LEN (1)));
 
 		  if (info != 0) 
 		    info = -2;
 
-		  volatile float rcond_plus_one = rcond + 1.0;
-
-		  if (rcond_plus_one == 1.0 || xisnan (rcond))
+		  volatile float rcond_plus_one = rcon + 1.0;
+
+		  if (rcond_plus_one == 1.0 || xisnan (rcon))
 		    {
 		      info = -2;
 
 		      if (sing_handler)
-			sing_handler (rcond);
+			sing_handler (rcon);
 		      else
 			(*current_liboctave_error_handler)
 			  ("matrix singular to machine precision, rcond = %g",
-			   rcond);
+			   rcon);
 		    }
 		}
 
@@ -2026,60 +2193,60 @@
 FloatComplexMatrix::solve (MatrixType &typ, const FloatMatrix& b) const
 {
   octave_idx_type info;
-  float rcond;
-  return solve (typ, b, info, rcond, 0);
+  float rcon;
+  return solve (typ, b, info, rcon, 0);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::solve (MatrixType &typ, const FloatMatrix& b, 
 		      octave_idx_type& info) const
 {
-  float rcond;
-  return solve (typ, b, info, rcond, 0);
+  float rcon;
+  return solve (typ, b, info, rcon, 0);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::solve (MatrixType &typ, const FloatMatrix& b, octave_idx_type& info,
-		      float& rcond) const
+		      float& rcon) const
 {
-  return solve (typ, b, info, rcond, 0);
+  return solve (typ, b, info, rcon, 0);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::solve (MatrixType &typ, const FloatMatrix& b, octave_idx_type& info, 
-		      float& rcond, solve_singularity_handler sing_handler,
+		      float& rcon, solve_singularity_handler sing_handler,
 		      bool singular_fallback) const
 {
   FloatComplexMatrix tmp (b);
-  return solve (typ, tmp, info, rcond, sing_handler, singular_fallback);
+  return solve (typ, tmp, info, rcon, sing_handler, singular_fallback);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::solve (MatrixType &typ, const FloatComplexMatrix& b) const
 {
   octave_idx_type info;
-  float rcond;
-  return solve (typ, b, info, rcond, 0);
+  float rcon;
+  return solve (typ, b, info, rcon, 0);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::solve (MatrixType &typ, const FloatComplexMatrix& b, 
 		      octave_idx_type& info) const
 {
-  float rcond;
-  return solve (typ, b, info, rcond, 0);
+  float rcon;
+  return solve (typ, b, info, rcon, 0);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::solve (MatrixType &typ, const FloatComplexMatrix& b, 
-		      octave_idx_type& info, float& rcond) const
+		      octave_idx_type& info, float& rcon) const
 {
-  return solve (typ, b, info, rcond, 0);
+  return solve (typ, b, info, rcon, 0);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::solve (MatrixType &mattype, const FloatComplexMatrix& b, 
-		      octave_idx_type& info, float& rcond,
+		      octave_idx_type& info, float& rcon,
 		      solve_singularity_handler sing_handler,
 		      bool singular_fallback) const
 {
@@ -2091,11 +2258,11 @@
 
   // Only calculate the condition number for LU/Cholesky
   if (typ == MatrixType::Upper || typ == MatrixType::Permuted_Upper)
-    retval = utsolve (mattype, b, info, rcond, sing_handler, false);
+    retval = utsolve (mattype, b, info, rcon, sing_handler, false);
   else if (typ == MatrixType::Lower || typ == MatrixType::Permuted_Lower)
-    retval = ltsolve (mattype, b, info, rcond, sing_handler, false);
+    retval = ltsolve (mattype, b, info, rcon, sing_handler, false);
   else if (typ == MatrixType::Full || typ == MatrixType::Hermitian)
-    retval = fsolve (mattype, b, info, rcond, sing_handler, true);
+    retval = fsolve (mattype, b, info, rcon, sing_handler, true);
   else if (typ != MatrixType::Rectangular)
     {
       (*current_liboctave_error_handler) ("unknown matrix type");
@@ -2106,7 +2273,7 @@
   if (singular_fallback && mattype.type () == MatrixType::Rectangular)
     {
       octave_idx_type rank;
-      retval = lssolve (b, info, rank, rcond);
+      retval = lssolve (b, info, rank, rcon);
     }
 
   return retval;
@@ -2116,183 +2283,183 @@
 FloatComplexMatrix::solve (MatrixType &typ, const FloatColumnVector& b) const
 {
   octave_idx_type info;
-  float rcond;
-  return solve (typ, FloatComplexColumnVector (b), info, rcond, 0);
+  float rcon;
+  return solve (typ, FloatComplexColumnVector (b), info, rcon, 0);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::solve (MatrixType &typ, const FloatColumnVector& b, 
 		      octave_idx_type& info) const
 {
-  float rcond;
-  return solve (typ, FloatComplexColumnVector (b), info, rcond, 0);
+  float rcon;
+  return solve (typ, FloatComplexColumnVector (b), info, rcon, 0);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::solve (MatrixType &typ, const FloatColumnVector& b, 
-		      octave_idx_type& info, float& rcond) const
+		      octave_idx_type& info, float& rcon) const
 {
-  return solve (typ, FloatComplexColumnVector (b), info, rcond, 0);
+  return solve (typ, FloatComplexColumnVector (b), info, rcon, 0);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::solve (MatrixType &typ, const FloatColumnVector& b, 
-		      octave_idx_type& info, float& rcond,
+		      octave_idx_type& info, float& rcon,
 		      solve_singularity_handler sing_handler) const
 {
-  return solve (typ, FloatComplexColumnVector (b), info, rcond, sing_handler);
+  return solve (typ, FloatComplexColumnVector (b), info, rcon, sing_handler);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::solve (MatrixType &typ, const FloatComplexColumnVector& b) const
 {
   octave_idx_type info;
-  float rcond;
-  return solve (typ, b, info, rcond, 0);
+  float rcon;
+  return solve (typ, b, info, rcon, 0);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::solve (MatrixType &typ, const FloatComplexColumnVector& b, 
 		      octave_idx_type& info) const
 {
-  float rcond;
-  return solve (typ, b, info, rcond, 0);
+  float rcon;
+  return solve (typ, b, info, rcon, 0);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::solve (MatrixType &typ, const FloatComplexColumnVector& b,
-		      octave_idx_type& info, float& rcond) const
+		      octave_idx_type& info, float& rcon) const
 {
-  return solve (typ, b, info, rcond, 0);
+  return solve (typ, b, info, rcon, 0);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::solve (MatrixType &typ, const FloatComplexColumnVector& b,
-		      octave_idx_type& info, float& rcond,
+		      octave_idx_type& info, float& rcon,
 		      solve_singularity_handler sing_handler) const
 {
 
   FloatComplexMatrix tmp (b);
-  return solve (typ, tmp, info, rcond, sing_handler).column(static_cast<octave_idx_type> (0));
+  return solve (typ, tmp, info, rcon, sing_handler).column(static_cast<octave_idx_type> (0));
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::solve (const FloatMatrix& b) const
 {
   octave_idx_type info;
-  float rcond;
-  return solve (b, info, rcond, 0);
+  float rcon;
+  return solve (b, info, rcon, 0);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::solve (const FloatMatrix& b, octave_idx_type& info) const
 {
-  float rcond;
-  return solve (b, info, rcond, 0);
+  float rcon;
+  return solve (b, info, rcon, 0);
 }
 
 FloatComplexMatrix
-FloatComplexMatrix::solve (const FloatMatrix& b, octave_idx_type& info, float& rcond) const
+FloatComplexMatrix::solve (const FloatMatrix& b, octave_idx_type& info, float& rcon) const
 {
-  return solve (b, info, rcond, 0);
+  return solve (b, info, rcon, 0);
 }
 
 FloatComplexMatrix
-FloatComplexMatrix::solve (const FloatMatrix& b, octave_idx_type& info, float& rcond,
+FloatComplexMatrix::solve (const FloatMatrix& b, octave_idx_type& info, float& rcon,
 		      solve_singularity_handler sing_handler) const
 {
   FloatComplexMatrix tmp (b);
-  return solve (tmp, info, rcond, sing_handler);
+  return solve (tmp, info, rcon, sing_handler);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::solve (const FloatComplexMatrix& b) const
 {
   octave_idx_type info;
-  float rcond;
-  return solve (b, info, rcond, 0);
+  float rcon;
+  return solve (b, info, rcon, 0);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::solve (const FloatComplexMatrix& b, octave_idx_type& info) const
 {
-  float rcond;
-  return solve (b, info, rcond, 0);
+  float rcon;
+  return solve (b, info, rcon, 0);
 }
 
 FloatComplexMatrix
-FloatComplexMatrix::solve (const FloatComplexMatrix& b, octave_idx_type& info, float& rcond) const
+FloatComplexMatrix::solve (const FloatComplexMatrix& b, octave_idx_type& info, float& rcon) const
 {
-  return solve (b, info, rcond, 0);
+  return solve (b, info, rcon, 0);
 }
 
 FloatComplexMatrix
-FloatComplexMatrix::solve (const FloatComplexMatrix& b, octave_idx_type& info, float& rcond,
+FloatComplexMatrix::solve (const FloatComplexMatrix& b, octave_idx_type& info, float& rcon,
 		      solve_singularity_handler sing_handler) const
 {
   MatrixType mattype (*this);
-  return solve (mattype, b, info, rcond, sing_handler);
+  return solve (mattype, b, info, rcon, sing_handler);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::solve (const FloatColumnVector& b) const
 {
   octave_idx_type info;
-  float rcond;
-  return solve (FloatComplexColumnVector (b), info, rcond, 0);
+  float rcon;
+  return solve (FloatComplexColumnVector (b), info, rcon, 0);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::solve (const FloatColumnVector& b, octave_idx_type& info) const
 {
-  float rcond;
-  return solve (FloatComplexColumnVector (b), info, rcond, 0);
+  float rcon;
+  return solve (FloatComplexColumnVector (b), info, rcon, 0);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::solve (const FloatColumnVector& b, octave_idx_type& info, 
-		      float& rcond) const
+		      float& rcon) const
 {
-  return solve (FloatComplexColumnVector (b), info, rcond, 0);
+  return solve (FloatComplexColumnVector (b), info, rcon, 0);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::solve (const FloatColumnVector& b, octave_idx_type& info, 
-		      float& rcond, 
+		      float& rcon, 
 		      solve_singularity_handler sing_handler) const
 {
-  return solve (FloatComplexColumnVector (b), info, rcond, sing_handler);
+  return solve (FloatComplexColumnVector (b), info, rcon, sing_handler);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::solve (const FloatComplexColumnVector& b) const
 {
   octave_idx_type info;
-  float rcond;
-  return solve (b, info, rcond, 0);
+  float rcon;
+  return solve (b, info, rcon, 0);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::solve (const FloatComplexColumnVector& b, octave_idx_type& info) const
 {
-  float rcond;
-  return solve (b, info, rcond, 0);
+  float rcon;
+  return solve (b, info, rcon, 0);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::solve (const FloatComplexColumnVector& b, octave_idx_type& info,
-		      float& rcond) const
+		      float& rcon) const
 {
-  return solve (b, info, rcond, 0);
+  return solve (b, info, rcon, 0);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::solve (const FloatComplexColumnVector& b, octave_idx_type& info,
-		      float& rcond,
+		      float& rcon,
 		      solve_singularity_handler sing_handler) const
 {
   MatrixType mattype (*this);
-  return solve (mattype, b, info, rcond, sing_handler);
+  return solve (mattype, b, info, rcon, sing_handler);
 }
 
 FloatComplexMatrix
@@ -2300,31 +2467,31 @@
 {
   octave_idx_type info;
   octave_idx_type rank;
-  float rcond;
-  return lssolve (FloatComplexMatrix (b), info, rank, rcond);
+  float rcon;
+  return lssolve (FloatComplexMatrix (b), info, rank, rcon);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::lssolve (const FloatMatrix& b, octave_idx_type& info) const
 {
   octave_idx_type rank;
-  float rcond;
-  return lssolve (FloatComplexMatrix (b), info, rank, rcond);
+  float rcon;
+  return lssolve (FloatComplexMatrix (b), info, rank, rcon);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::lssolve (const FloatMatrix& b, octave_idx_type& info,
 			octave_idx_type& rank) const
 {
-  float rcond;
-  return lssolve (FloatComplexMatrix (b), info, rank, rcond);
+  float rcon;
+  return lssolve (FloatComplexMatrix (b), info, rank, rcon);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::lssolve (const FloatMatrix& b, octave_idx_type& info,
-			octave_idx_type& rank, float& rcond) const
+			octave_idx_type& rank, float& rcon) const
 {
-  return lssolve (FloatComplexMatrix (b), info, rank, rcond);
+  return lssolve (FloatComplexMatrix (b), info, rank, rcon);
 }
 
 FloatComplexMatrix
@@ -2332,29 +2499,29 @@
 {
   octave_idx_type info;
   octave_idx_type rank;
-  float rcond;
-  return lssolve (b, info, rank, rcond);
+  float rcon;
+  return lssolve (b, info, rank, rcon);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::lssolve (const FloatComplexMatrix& b, octave_idx_type& info) const
 {
   octave_idx_type rank;
-  float rcond;
-  return lssolve (b, info, rank, rcond);
+  float rcon;
+  return lssolve (b, info, rank, rcon);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::lssolve (const FloatComplexMatrix& b, octave_idx_type& info,
 			octave_idx_type& rank) const
 {
-  float rcond;
-  return lssolve (b, info, rank, rcond);
+  float rcon;
+  return lssolve (b, info, rank, rcon);
 }
 
 FloatComplexMatrix
 FloatComplexMatrix::lssolve (const FloatComplexMatrix& b, octave_idx_type& info, 
-			octave_idx_type& rank, float& rcond) const
+			octave_idx_type& rank, float& rcon) const
 {
   FloatComplexMatrix retval;
 
@@ -2372,7 +2539,7 @@
     {
       volatile octave_idx_type minmn = (m < n ? m : n);
       octave_idx_type maxmn = m > n ? m : n;
-      rcond = -1.0;
+      rcon = -1.0;
 
       if (m != n)
 	{
@@ -2439,7 +2606,7 @@
       octave_idx_type* piwork = iwork.fortran_vec ();
 
       F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
-				 ps, rcond, rank, work.fortran_vec (),
+				 ps, rcon, rank, work.fortran_vec (),
 				 lwork, prwork, piwork, info));
 
       // The workspace query is broken in at least LAPACK 3.0.0
@@ -2476,19 +2643,19 @@
       work.resize (lwork);
 
       F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, tmp_data, m, pretval,
-				 maxmn, ps, rcond, rank,
+				 maxmn, ps, rcon, rank,
 				 work.fortran_vec (), lwork, 
 				 prwork, piwork, info));
 
       if (rank < minmn)
 	(*current_liboctave_warning_handler) 
 	  ("zgelsd: rank deficient %dx%d matrix, rank = %d, tol = %e",
-	   m, n, rank, rcond);
+	   m, n, rank, rcon);
 
       if (s.elem (0) == 0.0)
-	rcond = 0.0;
+	rcon = 0.0;
       else
-	rcond = s.elem (minmn - 1) / s.elem (0);
+	rcon = s.elem (minmn - 1) / s.elem (0);
 
       retval.resize (n, nrhs);
     }
@@ -2501,31 +2668,31 @@
 {
   octave_idx_type info;
   octave_idx_type rank;
-  float rcond;
-  return lssolve (FloatComplexColumnVector (b), info, rank, rcond);
+  float rcon;
+  return lssolve (FloatComplexColumnVector (b), info, rank, rcon);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::lssolve (const FloatColumnVector& b, octave_idx_type& info) const
 {
   octave_idx_type rank;
-  float rcond;
-  return lssolve (FloatComplexColumnVector (b), info, rank, rcond);
+  float rcon;
+  return lssolve (FloatComplexColumnVector (b), info, rank, rcon);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::lssolve (const FloatColumnVector& b, octave_idx_type& info, 
 			octave_idx_type& rank) const
 {
-  float rcond;
-  return lssolve (FloatComplexColumnVector (b), info, rank, rcond);
+  float rcon;
+  return lssolve (FloatComplexColumnVector (b), info, rank, rcon);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::lssolve (const FloatColumnVector& b, octave_idx_type& info, 
-			octave_idx_type& rank, float& rcond) const
+			octave_idx_type& rank, float& rcon) const
 {
-  return lssolve (FloatComplexColumnVector (b), info, rank, rcond);
+  return lssolve (FloatComplexColumnVector (b), info, rank, rcon);
 }
 
 FloatComplexColumnVector
@@ -2533,30 +2700,30 @@
 {
   octave_idx_type info;
   octave_idx_type rank;
-  float rcond;
-  return lssolve (b, info, rank, rcond);
+  float rcon;
+  return lssolve (b, info, rank, rcon);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::lssolve (const FloatComplexColumnVector& b, octave_idx_type& info) const
 {
   octave_idx_type rank;
-  float rcond;
-  return lssolve (b, info, rank, rcond);
+  float rcon;
+  return lssolve (b, info, rank, rcon);
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::lssolve (const FloatComplexColumnVector& b, octave_idx_type& info,
 			octave_idx_type& rank) const
 {
-  float rcond;
-  return lssolve (b, info, rank, rcond);
+  float rcon;
+  return lssolve (b, info, rank, rcon);
 
 }
 
 FloatComplexColumnVector
 FloatComplexMatrix::lssolve (const FloatComplexColumnVector& b, octave_idx_type& info,
-			octave_idx_type& rank, float& rcond) const
+			octave_idx_type& rank, float& rcon) const
 {
   FloatComplexColumnVector retval;
 
@@ -2574,7 +2741,7 @@
     {
       volatile octave_idx_type minmn = (m < n ? m : n);
       octave_idx_type maxmn = m > n ? m : n;
-      rcond = -1.0;
+      rcon = -1.0;
 
       if (m != n)
 	{
@@ -2633,7 +2800,7 @@
       octave_idx_type* piwork = iwork.fortran_vec ();
 
       F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, tmp_data, m, pretval, maxmn,
-				 ps, rcond, rank, work.fortran_vec (),
+				 ps, rcon, rank, work.fortran_vec (),
 				 lwork, prwork, piwork, info));
 
       lwork = static_cast<octave_idx_type> (std::real (work(0)));
@@ -2642,7 +2809,7 @@
       iwork.resize (iwork(0));
 
       F77_XFCN (cgelsd, CGELSD, (m, n, nrhs, tmp_data, m, pretval,
-				 maxmn, ps, rcond, rank,
+				 maxmn, ps, rcon, rank,
 				 work.fortran_vec (), lwork, 
 				 prwork, piwork, info));
 
@@ -2651,12 +2818,12 @@
 	  if (rank < minmn)
 	    (*current_liboctave_warning_handler) 
 	      ("zgelsd: rank deficient %dx%d matrix, rank = %d, tol = %e",
-	       m, n, rank, rcond);
+	       m, n, rank, rcon);
 
 	  if (s.elem (0) == 0.0)
-	    rcond = 0.0;
+	    rcon = 0.0;
 	  else
-	    rcond = s.elem (minmn - 1) / s.elem (0);
+	    rcon = s.elem (minmn - 1) / s.elem (0);
 
 	  retval.resize (n, nrhs);
 	}
@@ -2680,11 +2847,11 @@
 };
 
 static void
-solve_singularity_warning (float rcond)
+solve_singularity_warning (float rcon)
 {
   (*current_liboctave_warning_handler) 
     ("singular matrix encountered in expm calculation, rcond = %g",
-     rcond);
+     rcon);
 }
 
 FloatComplexMatrix
@@ -2811,8 +2978,8 @@
 
   // Compute pade approximation = inverse (dpp) * npp.
 
-  float rcond;
-  retval = dpp.solve (npp, info, rcond, solve_singularity_warning);
+  float rcon;
+  retval = dpp.solve (npp, info, rcon, solve_singularity_warning);
 
   if (info < 0)
     return retval;