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);