Mercurial > hg > octave-nkf
changeset 18549: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 +++ b/liboctave/array/CDiagMatrix.cc @@ -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 +++ b/liboctave/array/dDiagMatrix.cc @@ -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 +++ b/liboctave/array/fCDiagMatrix.cc @@ -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 +++ b/liboctave/array/fDiagMatrix.cc @@ -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;