# HG changeset patch # User Rik # Date 1392745176 28800 # Node ID 1fa5bba1621876012258d53d450273e67f7298fd # Parent 8473198fd005a7d538dd0c9cb9c29f28cf62f427 [mq]: pinv diff -r 8473198fd005 -r 1fa5bba16218 libinterp/corefcn/pinv.cc --- 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]'); + */ diff -r 8473198fd005 -r 1fa5bba16218 liboctave/array/CDiagMatrix.cc --- 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; diff -r 8473198fd005 -r 1fa5bba16218 liboctave/array/dDiagMatrix.cc --- 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; diff -r 8473198fd005 -r 1fa5bba16218 liboctave/array/fCDiagMatrix.cc --- 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; diff -r 8473198fd005 -r 1fa5bba16218 liboctave/array/fDiagMatrix.cc --- 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;