Mercurial > octave
changeset 25349:a8a4b6e6e754 stable
Fix lrwork dimension in svd for complex cases (bug #53823).
* svd.cc: Due to a bug in LAPACK <= 3.6, if jobz == 'N' then lrwork must be set
to 7*min_mn.
author | Marco Caliari <marco.caliari@univr.it> |
---|---|
date | Thu, 03 May 2018 16:47:30 +0200 |
parents | 087030cf86a0 |
children | cea0b7e47a0e 3d5f953e2ef6 |
files | liboctave/numeric/svd.cc |
diffstat | 1 files changed, 4 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/liboctave/numeric/svd.cc Thu May 03 21:04:01 2018 -0700 +++ b/liboctave/numeric/svd.cc Thu May 03 16:47:30 2018 +0200 @@ -222,12 +222,13 @@ { F77_INT min_mn = std::min (m, n); + F77_INT max_mn = std::max (m, n); F77_INT lrwork; if (jobz == 'N') lrwork = 7*min_mn; else - lrwork = 5*min_mn*min_mn + 5*min_mn; + lrwork = min_mn * std::max (5*min_mn+5, 2*max_mn+2*min_mn+1); std::vector<double> rwork (lrwork); @@ -255,9 +256,9 @@ F77_INT lrwork; if (jobz == 'N') - lrwork = 5*min_mn; + lrwork = 7*min_mn; else - lrwork = min_mn * std::max (5*min_mn+7, 2*max_mn+2*min_mn+1); + lrwork = min_mn * std::max (5*min_mn+5, 2*max_mn+2*min_mn+1); std::vector<float> rwork (lrwork); GESDD_COMPLEX_STEP (cgesdd, CGESDD, F77_CMPLX_ARG);