changeset 18494:1fa5bba16218

[mq]: pinv
author Rik <rik@octave.org>
date Tue, 18 Feb 2014 09:39:36 -0800
parents 8473198fd005
children 80b8873c90ba
files libinterp/corefcn/pinv.cc liboctave/array/CDiagMatrix.cc liboctave/array/dDiagMatrix.cc liboctave/array/fCDiagMatrix.cc liboctave/array/fDiagMatrix.cc
diffstat 5 files changed, 28 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/corefcn/pinv.cc	Tue Feb 18 02:51:48 2014 -0500
+++ b/libinterp/corefcn/pinv.cc	Tue Feb 18 09:39:36 2014 -0800
@@ -212,4 +212,20 @@
 %!assert (y*x*y, y, -hitol)
 %!assert ((x*y)', x*y, hitol)
 %!assert ((y*x)', y*x, hitol)
+
+## Clear shared variables
+%!shared
+
+## Test pinv for Diagonal matrices
+%!test
+%! x = diag ([3 2 1 0 -0.5]);
+%! y = pinv (x);
+%! assert (typeinfo (y)(1:8), "diagonal");
+%! assert (isa (y, "double"));
+%! assert (diag (y), [1/3, 1/2, 1, 0  1/-0.5]');
+%! y = pinv (x, 1);
+%! assert (diag (y), [1/3 1/2 1 0 0]');
+%! y = pinv (x, 2);
+%! assert (diag (y), [1/3 1/2 0 0 0]');
+
 */
--- a/liboctave/array/CDiagMatrix.cc	Tue Feb 18 02:51:48 2014 -0500
+++ b/liboctave/array/CDiagMatrix.cc	Tue Feb 18 09:39:36 2014 -0800
@@ -394,10 +394,10 @@
   for (octave_idx_type i = 0; i < len; i++)
     {
       double val = std::abs (elem (i, i));
-      if (val < tol || val == 0.0)
+      if (val < tol)
         retval.elem (i, i) = 0.0;
-      else
-        retval.elem (i, i) = 1.0 / val;
+      else if (val != 0.0)
+        retval.elem (i, i) = 1.0 / elem (i, i);
     }
 
   return retval;
--- a/liboctave/array/dDiagMatrix.cc	Tue Feb 18 02:51:48 2014 -0500
+++ b/liboctave/array/dDiagMatrix.cc	Tue Feb 18 09:39:36 2014 -0800
@@ -303,10 +303,10 @@
   for (octave_idx_type i = 0; i < len; i++)
     {
       double val = std::abs (elem (i, i));
-      if (val < tol || val == 0.0)
+      if (val < tol)
         retval.elem (i, i) = 0.0;
-      else
-        retval.elem (i, i) = 1.0 / val;
+      else if (val != 0.0)
+        retval.elem (i, i) = 1.0 / elem (i, i);
     }
 
   return retval;
--- a/liboctave/array/fCDiagMatrix.cc	Tue Feb 18 02:51:48 2014 -0500
+++ b/liboctave/array/fCDiagMatrix.cc	Tue Feb 18 09:39:36 2014 -0800
@@ -398,10 +398,10 @@
   for (octave_idx_type i = 0; i < len; i++)
     {
       float val = std::abs (elem (i, i));
-      if (val < tol || val == 0.0f)
+      if (val < tol)
         retval.elem (i, i) = 0.0f;
-      else
-        retval.elem (i, i) = 1.0f / val;
+      else if (val != 0.0f)
+        retval.elem (i, i) = 1.0f / elem (i, i);
     }
 
   return retval;
--- a/liboctave/array/fDiagMatrix.cc	Tue Feb 18 02:51:48 2014 -0500
+++ b/liboctave/array/fDiagMatrix.cc	Tue Feb 18 09:39:36 2014 -0800
@@ -303,10 +303,10 @@
   for (octave_idx_type i = 0; i < len; i++)
     {
       float val = std::abs (elem (i, i));
-      if (val < tol || val == 0.0f)
+      if (val < tol)
         retval.elem (i, i) = 0.0f;
-      else
-        retval.elem (i, i) = 1.0f / val;
+      else if (val != 0.0f)
+        retval.elem (i, i) = 1.0f / elem (i, i);
     }
 
   return retval;