diff liboctave/CmplxSVD.cc @ 537:4ecbfd3c3710

[project @ 1994-07-21 22:30:34 by jwe]
author jwe
date Thu, 21 Jul 1994 22:30:47 +0000
parents 3d4b4f0fa5ba
children 714fd17fca28
line wrap: on
line diff
--- a/liboctave/CmplxSVD.cc	Thu Jul 21 20:02:43 1994 +0000
+++ b/liboctave/CmplxSVD.cc	Thu Jul 21 22:30:47 1994 +0000
@@ -42,24 +42,35 @@
 }
 
 int
-ComplexSVD::init (const ComplexMatrix& a)
+ComplexSVD::init (const ComplexMatrix& a, SVD::type svd_type)
 {
   int info;
 
   int m = a.rows ();
   int n = a.cols ();
 
-  char jobu = 'A';
-  char jobv = 'A';
-
   Complex *tmp_data = dup (a.data (), a.length ());
 
   int min_mn = m < n ? m : n;
   int max_mn = m > n ? m : n;
 
-  Complex *u = new Complex[m*m];
+  char jobu = 'A';
+  char jobv = 'A';
+
+  int ncol_u = m;
+  int nrow_vt = n;
+  int nrow_s = m;
+  int ncol_s = n;
+
+  if (svd_type == SVD::economy)
+    {
+      jobu = jobv = 'S';
+      ncol_u = nrow_vt = nrow_s = ncol_s = min_mn;
+    }
+
+  Complex *u = new Complex[m * ncol_u];
   double *s_vec  = new double[min_mn];
-  Complex *vt = new Complex[n*n];
+  Complex *vt = new Complex[nrow_vt * n];
 
   int lwork = 2*min_mn + max_mn;
   Complex *work = new Complex[lwork];
@@ -68,12 +79,12 @@
   double *rwork = new double[lrwork];
 
   F77_FCN (zgesvd) (&jobu, &jobv, &m, &n, tmp_data, &m, s_vec, u, &m,
-		    vt, &n, work, &lwork, rwork, &info, 1L, 1L);
+		    vt, &nrow_vt, work, &lwork, rwork, &info, 1L, 1L);
 
-  left_sm = ComplexMatrix (u, m, m);
-  sigma = DiagMatrix (s_vec, m, n);
-  ComplexMatrix vt_m (vt, n, n);
-  right_sm = ComplexMatrix (vt_m.hermitian ());
+  left_sm = ComplexMatrix (u, m, ncol_u);
+  sigma = DiagMatrix (s_vec, nrow_s, ncol_s);
+  ComplexMatrix vt_m (vt, nrow_vt, n);
+  right_sm = vt_m.hermitian ();
 
   delete [] tmp_data;
   delete [] work;