diff liboctave/array/fDiagMatrix.cc @ 18467:c5a101de2d88

Allow pinv to work on Diagonal Matrices with a tolerance (bug #41546). * pinv.cc (Fpinv): Validate tolerance argument and pass it through to pseudo_inverse(). CDiagMatrix.h, dDiagMatrix.h, fCDiagMatrix.h, fDiagMatrix.h: Redefine prototype for pseudo_inverse to accept a single argument for tolerance. * CDiagMatrix.cc (pseudo_inverse), dDiagMatrix.cc(pseudo_inverse), fCDiagMatrix.cc(pseudo_inverse), fDiagMatrix.cc(pseudo_inverse): Use std::abs(elem) to get magnitude of element and only invert if value is greater than tolerance.
author Rik <rik@octave.org>
date Sat, 15 Feb 2014 14:42:07 -0800
parents 8e056300994b
children 16b0cd465ecd
line wrap: on
line diff
--- a/liboctave/array/fDiagMatrix.cc	Sat Feb 15 13:36:01 2014 -0800
+++ b/liboctave/array/fDiagMatrix.cc	Sat Feb 15 14:42:07 2014 -0800
@@ -292,7 +292,7 @@
 }
 
 FloatDiagMatrix
-FloatDiagMatrix::pseudo_inverse (void) const
+FloatDiagMatrix::pseudo_inverse (float tol) const
 {
   octave_idx_type r = rows ();
   octave_idx_type c = cols ();
@@ -302,10 +302,10 @@
 
   for (octave_idx_type i = 0; i < len; i++)
     {
-      if (elem (i, i) != 0.0f)
+      if (std::abs (elem (i, i)) < tol)
+        retval.elem (i, i) = 0.0f;
+      else
         retval.elem (i, i) = 1.0f / elem (i, i);
-      else
-        retval.elem (i, i) = 0.0f;
     }
 
   return retval;