changeset 18496:80b8873c90ba

Fix pinv bug with 0 values introduced in cset 16b0cd465ecd. * pinv.cc (Fpinv): Add %!tests for diagonal matrices * CDiagMatrix.cc (pseudo_inverse), dDiagMatrix.cc (pseudo_inverse), fCDiagMatrix.cc (pseudo_inverse), fDiagMatrix.cc (pseudo_inverse): Don't skip assigning 0 to retval element when matrix element is 0 since retval memory is not initialized to 0.
author Rik <rik@octave.org>
date Thu, 20 Feb 2014 09:26:45 -0800
parents 1fa5bba16218
children 4e0d72145c5a
files liboctave/array/CDiagMatrix.cc liboctave/array/dDiagMatrix.cc liboctave/array/fCDiagMatrix.cc liboctave/array/fDiagMatrix.cc
diffstat 4 files changed, 8 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/array/CDiagMatrix.cc	Tue Feb 18 09:39:36 2014 -0800
+++ b/liboctave/array/CDiagMatrix.cc	Thu Feb 20 09:26:45 2014 -0800
@@ -394,9 +394,9 @@
   for (octave_idx_type i = 0; i < len; i++)
     {
       double val = std::abs (elem (i, i));
-      if (val < tol)
+      if (val < tol || val == 0.0)
         retval.elem (i, i) = 0.0;
-      else if (val != 0.0)
+      else
         retval.elem (i, i) = 1.0 / elem (i, i);
     }
 
--- a/liboctave/array/dDiagMatrix.cc	Tue Feb 18 09:39:36 2014 -0800
+++ b/liboctave/array/dDiagMatrix.cc	Thu Feb 20 09:26:45 2014 -0800
@@ -303,9 +303,9 @@
   for (octave_idx_type i = 0; i < len; i++)
     {
       double val = std::abs (elem (i, i));
-      if (val < tol)
+      if (val < tol || val == 0.0)
         retval.elem (i, i) = 0.0;
-      else if (val != 0.0)
+      else
         retval.elem (i, i) = 1.0 / elem (i, i);
     }
 
--- a/liboctave/array/fCDiagMatrix.cc	Tue Feb 18 09:39:36 2014 -0800
+++ b/liboctave/array/fCDiagMatrix.cc	Thu Feb 20 09:26:45 2014 -0800
@@ -398,9 +398,9 @@
   for (octave_idx_type i = 0; i < len; i++)
     {
       float val = std::abs (elem (i, i));
-      if (val < tol)
+      if (val < tol || val == 0.0f)
         retval.elem (i, i) = 0.0f;
-      else if (val != 0.0f)
+      else
         retval.elem (i, i) = 1.0f / elem (i, i);
     }
 
--- a/liboctave/array/fDiagMatrix.cc	Tue Feb 18 09:39:36 2014 -0800
+++ b/liboctave/array/fDiagMatrix.cc	Thu Feb 20 09:26:45 2014 -0800
@@ -303,9 +303,9 @@
   for (octave_idx_type i = 0; i < len; i++)
     {
       float val = std::abs (elem (i, i));
-      if (val < tol)
+      if (val < tol || val == 0.0f)
         retval.elem (i, i) = 0.0f;
-      else if (val != 0.0f)
+      else
         retval.elem (i, i) = 1.0f / elem (i, i);
     }