comparison liboctave/dMatrix.cc @ 740:d8295febb0df

[project @ 1994-09-30 14:42:37 by jwe]
author jwe
date Fri, 30 Sep 1994 14:42:37 +0000
parents 01da6806197b
children 714fd17fca28
comparison
equal deleted inserted replaced
739:d452e6f52d12 740:d8295febb0df
30 #endif 30 #endif
31 31
32 #include <sys/types.h> 32 #include <sys/types.h>
33 #include <iostream.h> 33 #include <iostream.h>
34 #include <stdio.h> 34 #include <stdio.h>
35 #include <float.h>
35 36
36 #include <Complex.h> 37 #include <Complex.h>
37 38
38 #include "mx-base.h" 39 #include "mx-base.h"
39 #include "dbleDET.h" 40 #include "dbleDET.h"
41 #include "dbleSVD.h"
40 #include "mx-inlines.cc" 42 #include "mx-inlines.cc"
41 #include "lo-error.h" 43 #include "lo-error.h"
42 #include "f77-uscore.h" 44 #include "f77-uscore.h"
43 45
44 // Fortran functions we call. 46 // Fortran functions we call.
601 603
602 delete [] ipvt; 604 delete [] ipvt;
603 delete [] z; 605 delete [] z;
604 606
605 return Matrix (tmp_data, nr, nc); 607 return Matrix (tmp_data, nr, nc);
608 }
609
610 Matrix
611 Matrix::pseudo_inverse (double tol)
612 {
613 SVD result (*this);
614
615 DiagMatrix S = result.singular_values ();
616 Matrix U = result.left_singular_matrix ();
617 Matrix V = result.right_singular_matrix ();
618
619 ColumnVector sigma = S.diag ();
620
621 int r = sigma.length () - 1;
622 int nr = rows ();
623 int nc = cols ();
624
625 if (tol <= 0.0)
626 {
627 if (nr > nc)
628 tol = nr * sigma.elem (0) * DBL_EPSILON;
629 else
630 tol = nc * sigma.elem (0) * DBL_EPSILON;
631 }
632
633 while (r >= 0 && sigma.elem (r) < tol)
634 r--;
635
636 if (r < 0)
637 return Matrix (nc, nr, 0.0);
638 else
639 {
640 Matrix Ur = U.extract (0, 0, nr-1, r);
641 DiagMatrix D = DiagMatrix (sigma.extract (0, r)) . inverse ();
642 Matrix Vr = V.extract (0, 0, nc-1, r);
643 return Vr * D * Ur.transpose ();
644 }
606 } 645 }
607 646
608 ComplexMatrix 647 ComplexMatrix
609 Matrix::fourier (void) const 648 Matrix::fourier (void) const
610 { 649 {