comparison liboctave/CMatrix.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
29 #pragma implementation 29 #pragma implementation
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 <float.h>
34 35
35 #include <Complex.h> 36 #include <Complex.h>
36 37
37 #include "mx-base.h" 38 #include "mx-base.h"
38 #include "CmplxDET.h" 39 #include "CmplxDET.h"
40 #include "CmplxSVD.h"
39 #include "mx-inlines.cc" 41 #include "mx-inlines.cc"
40 #include "lo-error.h" 42 #include "lo-error.h"
41 #include "f77-uscore.h" 43 #include "f77-uscore.h"
42 44
43 // Fortran functions we call. 45 // Fortran functions we call.
952 954
953 delete [] ipvt; 955 delete [] ipvt;
954 delete [] z; 956 delete [] z;
955 957
956 return ComplexMatrix (tmp_data, nr, nc); 958 return ComplexMatrix (tmp_data, nr, nc);
959 }
960
961 ComplexMatrix
962 ComplexMatrix::pseudo_inverse (double tol)
963 {
964 ComplexSVD result (*this);
965
966 DiagMatrix S = result.singular_values ();
967 ComplexMatrix U = result.left_singular_matrix ();
968 ComplexMatrix V = result.right_singular_matrix ();
969
970 ColumnVector sigma = S.diag ();
971
972 int r = sigma.length () - 1;
973 int nr = rows ();
974 int nc = cols ();
975
976 if (tol <= 0.0)
977 {
978 if (nr > nc)
979 tol = nr * sigma.elem (0) * DBL_EPSILON;
980 else
981 tol = nc * sigma.elem (0) * DBL_EPSILON;
982 }
983
984 while (r >= 0 && sigma.elem (r) < tol)
985 r--;
986
987 if (r < 0)
988 return ComplexMatrix (nc, nr, 0.0);
989 else
990 {
991 ComplexMatrix Ur = U.extract (0, 0, nr-1, r);
992 DiagMatrix D = DiagMatrix (sigma.extract (0, r)) . inverse ();
993 ComplexMatrix Vr = V.extract (0, 0, nc-1, r);
994 return Vr * D * Ur.hermitian ();
995 }
957 } 996 }
958 997
959 ComplexMatrix 998 ComplexMatrix
960 ComplexMatrix::fourier (void) const 999 ComplexMatrix::fourier (void) const
961 { 1000 {