Mercurial > hg > octave-nkf
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 |