diff liboctave/dMatrix.cc @ 3752:719a44ff67c9

[project @ 2000-12-13 19:02:42 by jwe]
author jwe
date Wed, 13 Dec 2000 19:02:43 +0000
parents b7d997d593d9
children e63a3a6d7797
line wrap: on
line diff
--- a/liboctave/dMatrix.cc	Sun Dec 10 06:03:06 2000 +0000
+++ b/liboctave/dMatrix.cc	Wed Dec 13 19:02:43 2000 +0000
@@ -1200,32 +1200,37 @@
 
       double rcond = -1.0;
 
-      int lwork;
-      if (m < n)
-	lwork = 3*m + (2*m > nrhs
-		       ? (2*m > n ? 2*m : n)
-		       : (nrhs > n ? nrhs : n));
-      else
-	lwork = 3*n + (2*n > nrhs
-		       ? (2*n > m ? 2*n : m)
-		       : (nrhs > m ? nrhs : m));
-
-      lwork *= 16;
-
-      Array<double> work (lwork);
-      double *pwork = work.fortran_vec ();
+      // Ask DGELSS what the dimension of WORK should be.
+
+      int lwork = -1;
+
+      Array<double> work (1);
 
       F77_XFCN (dgelss, DGELSS, (m, n, nrhs, tmp_data, m, presult, nrr, ps,
-				 rcond, rank, pwork, lwork, info));
+				 rcond, rank, work.fortran_vec (),
+				 lwork, info));
 
       if (f77_exception_encountered)
 	(*current_liboctave_error_handler) ("unrecoverable error in dgelss");
       else
 	{
-	  retval.resize (n, nrhs);
-	  for (int j = 0; j < nrhs; j++)
-	    for (int i = 0; i < n; i++)
-	      retval.elem (i, j) = result.elem (i, j);
+	  lwork = static_cast<int> (work(0));
+	  work.resize (lwork);
+
+	  F77_XFCN (dgelss, DGELSS, (m, n, nrhs, tmp_data, m, presult,
+				     nrr, ps, rcond, rank,
+				     work.fortran_vec (), lwork, info));
+
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler)
+	      ("unrecoverable error in dgelss");
+	  else
+	    {
+	      retval.resize (n, nrhs);
+	      for (int j = 0; j < nrhs; j++)
+		for (int i = 0; i < n; i++)
+		  retval.elem (i, j) = result.elem (i, j);
+	    }
 	}
     }
 
@@ -1303,31 +1308,36 @@
 
       double rcond = -1.0;
 
-      int lwork;
-      if (m < n)
-	lwork = 3*m + (2*m > nrhs
-		       ? (2*m > n ? 2*m : n)
-		       : (nrhs > n ? nrhs : n));
-      else
-	lwork = 3*n + (2*n > nrhs
-		       ? (2*n > m ? 2*n : m)
-		       : (nrhs > m ? nrhs : m));
-
-      lwork *= 16;
-
-      Array<double> work (lwork);
-      double *pwork = work.fortran_vec ();
-
-      F77_XFCN (dgelss, DGELSS, (m, n, nrhs, tmp_data, m, presult, nrr,
-				 ps, rcond, rank, pwork, lwork, info));
+      // Ask DGELSS what the dimension of WORK should be.
+
+      int lwork = -1;
+
+      Array<double> work (1);
+
+      F77_XFCN (dgelss, DGELSS, (m, n, nrhs, tmp_data, m, presult, nrr, ps,
+				 rcond, rank, work.fortran_vec (),
+				 lwork, info));
 
       if (f77_exception_encountered)
 	(*current_liboctave_error_handler) ("unrecoverable error in dgelss");
       else
 	{
-	  retval.resize (n);
-	  for (int i = 0; i < n; i++)
-	    retval.elem (i) = result.elem (i);
+	  lwork = static_cast<int> (work(0));
+	  work.resize (lwork);
+
+	  F77_XFCN (dgelss, DGELSS, (m, n, nrhs, tmp_data, m, presult,
+				     nrr, ps, rcond, rank,
+				     work.fortran_vec (), lwork, info));
+
+	  if (f77_exception_encountered)
+	    (*current_liboctave_error_handler)
+	      ("unrecoverable error in dgelss");
+	  else
+	    {
+	      retval.resize (n);
+	      for (int i = 0; i < n; i++)
+		retval.elem (i) = result.elem (i);
+	    }
 	}
     }