# HG changeset patch # User Rik # Date 1392917205 28800 # Node ID 80b8873c90ba9198a0d69f74642f47696cdc84e8 # Parent 1fa5bba1621876012258d53d450273e67f7298fd Fix pinv bug with 0 values introduced in cset 16b0cd465ecd. * pinv.cc (Fpinv): Add %!tests for diagonal matrices * CDiagMatrix.cc (pseudo_inverse), dDiagMatrix.cc (pseudo_inverse), fCDiagMatrix.cc (pseudo_inverse), fDiagMatrix.cc (pseudo_inverse): Don't skip assigning 0 to retval element when matrix element is 0 since retval memory is not initialized to 0. diff -r 1fa5bba16218 -r 80b8873c90ba liboctave/array/CDiagMatrix.cc --- a/liboctave/array/CDiagMatrix.cc Tue Feb 18 09:39:36 2014 -0800 +++ b/liboctave/array/CDiagMatrix.cc Thu Feb 20 09:26:45 2014 -0800 @@ -394,9 +394,9 @@ for (octave_idx_type i = 0; i < len; i++) { double val = std::abs (elem (i, i)); - if (val < tol) + if (val < tol || val == 0.0) retval.elem (i, i) = 0.0; - else if (val != 0.0) + else retval.elem (i, i) = 1.0 / elem (i, i); } diff -r 1fa5bba16218 -r 80b8873c90ba liboctave/array/dDiagMatrix.cc --- a/liboctave/array/dDiagMatrix.cc Tue Feb 18 09:39:36 2014 -0800 +++ b/liboctave/array/dDiagMatrix.cc Thu Feb 20 09:26:45 2014 -0800 @@ -303,9 +303,9 @@ for (octave_idx_type i = 0; i < len; i++) { double val = std::abs (elem (i, i)); - if (val < tol) + if (val < tol || val == 0.0) retval.elem (i, i) = 0.0; - else if (val != 0.0) + else retval.elem (i, i) = 1.0 / elem (i, i); } diff -r 1fa5bba16218 -r 80b8873c90ba liboctave/array/fCDiagMatrix.cc --- a/liboctave/array/fCDiagMatrix.cc Tue Feb 18 09:39:36 2014 -0800 +++ b/liboctave/array/fCDiagMatrix.cc Thu Feb 20 09:26:45 2014 -0800 @@ -398,9 +398,9 @@ for (octave_idx_type i = 0; i < len; i++) { float val = std::abs (elem (i, i)); - if (val < tol) + if (val < tol || val == 0.0f) retval.elem (i, i) = 0.0f; - else if (val != 0.0f) + else retval.elem (i, i) = 1.0f / elem (i, i); } diff -r 1fa5bba16218 -r 80b8873c90ba liboctave/array/fDiagMatrix.cc --- a/liboctave/array/fDiagMatrix.cc Tue Feb 18 09:39:36 2014 -0800 +++ b/liboctave/array/fDiagMatrix.cc Thu Feb 20 09:26:45 2014 -0800 @@ -303,9 +303,9 @@ for (octave_idx_type i = 0; i < len; i++) { float val = std::abs (elem (i, i)); - if (val < tol) + if (val < tol || val == 0.0f) retval.elem (i, i) = 0.0f; - else if (val != 0.0f) + else retval.elem (i, i) = 1.0f / elem (i, i); }