changeset 18481:16b0cd465ecd

Handle special case of 0 for pinv with Diagonal matrices. * CDiagMatrix.cc (pseudo_inverse), dDiagMatrix.cc (pseudo_inverse), fCDiagMatrix.cc (pseudo_inverse), fDiagMatrix.cc (pseudo_inverse): Check for special case where element is 0 to avoid a division by zero error.
author Rik <rik@octave.org>
date Mon, 17 Feb 2014 10:04:27 -0800
parents b2a2f097c5e0
children 8473198fd005
files liboctave/array/CDiagMatrix.cc liboctave/array/dDiagMatrix.cc liboctave/array/fCDiagMatrix.cc liboctave/array/fDiagMatrix.cc
diffstat 4 files changed, 12 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/liboctave/array/CDiagMatrix.cc	Sat Feb 15 20:19:42 2014 -0800
+++ b/liboctave/array/CDiagMatrix.cc	Mon Feb 17 10:04:27 2014 -0800
@@ -393,10 +393,11 @@
 
   for (octave_idx_type i = 0; i < len; i++)
     {
-      if (std::abs (elem (i, i)) < tol)
+      double val = std::abs (elem (i, i));
+      if (val < tol || val == 0.0)
         retval.elem (i, i) = 0.0;
       else
-        retval.elem (i, i) = 1.0 / elem (i, i);
+        retval.elem (i, i) = 1.0 / val;
     }
 
   return retval;
--- a/liboctave/array/dDiagMatrix.cc	Sat Feb 15 20:19:42 2014 -0800
+++ b/liboctave/array/dDiagMatrix.cc	Mon Feb 17 10:04:27 2014 -0800
@@ -302,10 +302,11 @@
 
   for (octave_idx_type i = 0; i < len; i++)
     {
-      if (std::abs (elem (i, i)) < tol)
+      double val = std::abs (elem (i, i));
+      if (val < tol || val == 0.0)
         retval.elem (i, i) = 0.0;
       else
-        retval.elem (i, i) = 1.0 / elem (i, i);
+        retval.elem (i, i) = 1.0 / val;
     }
 
   return retval;
--- a/liboctave/array/fCDiagMatrix.cc	Sat Feb 15 20:19:42 2014 -0800
+++ b/liboctave/array/fCDiagMatrix.cc	Mon Feb 17 10:04:27 2014 -0800
@@ -397,10 +397,11 @@
 
   for (octave_idx_type i = 0; i < len; i++)
     {
-      if (std::abs (elem (i, i)) < tol)
+      float val = std::abs (elem (i, i));
+      if (val < tol || val == 0.0f)
         retval.elem (i, i) = 0.0f;
       else
-        retval.elem (i, i) = 1.0f / elem (i, i);
+        retval.elem (i, i) = 1.0f / val;
     }
 
   return retval;
--- a/liboctave/array/fDiagMatrix.cc	Sat Feb 15 20:19:42 2014 -0800
+++ b/liboctave/array/fDiagMatrix.cc	Mon Feb 17 10:04:27 2014 -0800
@@ -302,10 +302,11 @@
 
   for (octave_idx_type i = 0; i < len; i++)
     {
-      if (std::abs (elem (i, i)) < tol)
+      float val = std::abs (elem (i, i));
+      if (val < tol || val == 0.0f)
         retval.elem (i, i) = 0.0f;
       else
-        retval.elem (i, i) = 1.0f / elem (i, i);
+        retval.elem (i, i) = 1.0f / val;
     }
 
   return retval;