Mercurial > octave
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;