Mercurial > octave
diff liboctave/CmplxSVD.cc @ 3336:08ad797989f8
[project @ 1999-11-03 21:41:34 by jwe]
author | jwe |
---|---|
date | Wed, 03 Nov 1999 21:41:35 +0000 |
parents | f39b97e13cf2 |
children | 7da18459c08b |
line wrap: on
line diff
--- a/liboctave/CmplxSVD.cc Wed Nov 03 21:05:01 1999 +0000 +++ b/liboctave/CmplxSVD.cc Wed Nov 03 21:41:35 1999 +0000 @@ -131,26 +131,41 @@ Complex *vt = right_sm.fortran_vec (); - int lwork = 2*min_mn + max_mn; - - Array<Complex> work (lwork); - Complex *pwork = work.fortran_vec (); - int lrwork = 5*max_mn; Array<double> rwork (lrwork); - double *prwork = rwork.fortran_vec (); + + // Ask ZGESVD what the dimension of WORK should be. + + int lwork = -1; - F77_XFCN (zgesvd, ZGESVD, (&jobu, &jobv, m, n, tmp_data, m, s_vec, u, - m, vt, nrow_vt, pwork, lwork, prwork, info, - 1L, 1L)); + Array<Complex> work (1); + + F77_XFCN (zgesvd, ZGESVD, (&jobu, &jobv, m, n, tmp_data, m, s_vec, + u, m, vt, nrow_vt, work.fortran_vec (), + lwork, rwork.fortran_vec (), info, 1L, + 1L)); if (f77_exception_encountered) (*current_liboctave_error_handler) ("unrecoverable error in zgesvd"); else { - if (! (jobv == 'N' || jobv == 'O')) - right_sm = right_sm.hermitian (); + lwork = static_cast<int> (work(0).real ()); + work.resize (lwork); + + F77_XFCN (zgesvd, ZGESVD, (&jobu, &jobv, m, n, tmp_data, m, + s_vec, u, m, vt, nrow_vt, + work.fortran_vec (), lwork, + rwork.fortran_vec (), + info, 1L, 1L)); + + if (f77_exception_encountered) + (*current_liboctave_error_handler) ("unrecoverable error in zgesvd"); + else + { + if (! (jobv == 'N' || jobv == 'O')) + right_sm = right_sm.hermitian (); + } } return info;