00001
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef SVDCMP_H
00026 #define SVDCMP_H
00027
00028 #include "Array2D.h"
00029 #include "math.h"
00030
00031 template<typename T>inline T SignOfNeg(T a,T b)
00032 { return(b<0.0 ? fabs(a) : -fabs(a)); }
00033
00034 template<typename T>
00035 T HYPOT(T a, T b){
00036 double absa = fabs(a);
00037 double absb = fabs(b);
00038 if(absa > absb)
00039 return absa*sqrt(1.0 + absb*absb/absa/absa);
00040 else
00041 return (absb == 0.0 ? 0.0 : absb*sqrt(1.0 + absa*absa/absb/absb) );
00042 }
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057 template<typename T>int _SVDecompose(Array2D<T> &A, Array1D<T> &W, Array2D<T> &V,
00058 int maxiter);
00059
00060
00061
00062
00063
00064
00065
00066
00067 template<typename T>int _SVDFwBackSubst(const Array2D<T> &U, const Array1D<T> &W,
00068 const Array2D<T> &V, Array2D<T> &inv);
00069
00070 int SVDecompose(Array2D<double> &a,Array1D<double> &w,Array2D<double> &v,int maxiter);
00071 int SVDecompose(Array2D<float> &a,Array1D<float> &w,Array2D<float> &v,int maxiter);
00072
00073 int SVDFwBackSubst(const Array2D<double> &u, const Array1D<double> &w,
00074 const Array2D<double> &v, Array2D<double> &inv);
00075 int SVDFwBackSubst(const Array2D<float> &u, const Array1D<float> &w,
00076 const Array2D<float> &v, Array2D<float> &inv);
00077
00078
00079 #endif
00080
00081