# HG changeset patch # User Rik # Date 1392660267 28800 # Node ID 16b0cd465ecd4751e27bbd2ed643c2287d7cdbec # Parent b2a2f097c5e0e4b62b626851373746641e6d4247 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. diff -r b2a2f097c5e0 -r 16b0cd465ecd liboctave/array/CDiagMatrix.cc --- a/liboctave/array/CDiagMatrix.cc Sat Feb 15 20:19:42 2014 -0800 +++ b/liboctave/array/CDiagMatrix.cc Mon Feb 17 10:04:27 2014 -0800 @@ -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; diff -r b2a2f097c5e0 -r 16b0cd465ecd liboctave/array/dDiagMatrix.cc --- a/liboctave/array/dDiagMatrix.cc Sat Feb 15 20:19:42 2014 -0800 +++ b/liboctave/array/dDiagMatrix.cc Mon Feb 17 10:04:27 2014 -0800 @@ -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; diff -r b2a2f097c5e0 -r 16b0cd465ecd liboctave/array/fCDiagMatrix.cc --- a/liboctave/array/fCDiagMatrix.cc Sat Feb 15 20:19:42 2014 -0800 +++ b/liboctave/array/fCDiagMatrix.cc Mon Feb 17 10:04:27 2014 -0800 @@ -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; diff -r b2a2f097c5e0 -r 16b0cd465ecd liboctave/array/fDiagMatrix.cc --- a/liboctave/array/fDiagMatrix.cc Sat Feb 15 20:19:42 2014 -0800 +++ b/liboctave/array/fDiagMatrix.cc Mon Feb 17 10:04:27 2014 -0800 @@ -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;