comparison liboctave/array/dDiagMatrix.cc @ 18535:c5a101de2d88

Allow pinv to work on Diagonal Matrices with a tolerance (bug #41546). * pinv.cc (Fpinv): Validate tolerance argument and pass it through to pseudo_inverse(). CDiagMatrix.h, dDiagMatrix.h, fCDiagMatrix.h, fDiagMatrix.h: Redefine prototype for pseudo_inverse to accept a single argument for tolerance. * CDiagMatrix.cc (pseudo_inverse), dDiagMatrix.cc(pseudo_inverse), fCDiagMatrix.cc(pseudo_inverse), fDiagMatrix.cc(pseudo_inverse): Use std::abs(elem) to get magnitude of element and only invert if value is greater than tolerance.
author Rik <rik@octave.org>
date Sat, 15 Feb 2014 14:42:07 -0800
parents 8e056300994b
children 16b0cd465ecd
comparison
equal deleted inserted replaced
18534:a3611f3e80eb 18535:c5a101de2d88
290 290
291 return retval; 291 return retval;
292 } 292 }
293 293
294 DiagMatrix 294 DiagMatrix
295 DiagMatrix::pseudo_inverse (void) const 295 DiagMatrix::pseudo_inverse (double tol) const
296 { 296 {
297 octave_idx_type r = rows (); 297 octave_idx_type r = rows ();
298 octave_idx_type c = cols (); 298 octave_idx_type c = cols ();
299 octave_idx_type len = length (); 299 octave_idx_type len = length ();
300 300
301 DiagMatrix retval (c, r); 301 DiagMatrix retval (c, r);
302 302
303 for (octave_idx_type i = 0; i < len; i++) 303 for (octave_idx_type i = 0; i < len; i++)
304 { 304 {
305 if (elem (i, i) != 0.0) 305 if (std::abs (elem (i, i)) < tol)
306 retval.elem (i, i) = 0.0;
307 else
306 retval.elem (i, i) = 1.0 / elem (i, i); 308 retval.elem (i, i) = 1.0 / elem (i, i);
307 else
308 retval.elem (i, i) = 0.0;
309 } 309 }
310 310
311 return retval; 311 return retval;
312 } 312 }
313 313