00001 #ifndef _theplu_yat_utility_svd_
00002 #define _theplu_yat_utility_svd_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "Matrix.h"
00030 #include "Vector.h"
00031
00032 #include <gsl/gsl_linalg.h>
00033
00034 namespace theplu {
00035 namespace yat {
00036 namespace utility {
00037
00038 class VectorBase;
00039
00053 class SVD
00054 {
00055 public:
00056
00063 enum SVDalgorithm {
00064 GolubReinsch,
00065 ModifiedGolubReinsch,
00066 Jacobi
00067 };
00068
00076 SVD(const utility::Matrix& Ain);
00077
00081 ~SVD(void);
00082
00089 void decompose(SVDalgorithm algo=GolubReinsch);
00090
00099 const utility::Vector& s(void) const;
00100
00110 void solve(const utility::VectorBase& b, utility::Vector& x);
00111
00120 const utility::Matrix& U(void) const;
00121
00130 const utility::Matrix& V(void) const;
00131
00132 private:
00138 int jacobi(void);
00139
00145 int golub_reinsch(void);
00146
00152 int modified_golub_reinsch(void);
00153
00154 utility::Matrix U_, V_;
00155 utility::Vector s_;
00156 };
00157
00158 }}}
00159
00160 #endif