00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 #ifndef SYNAPS_LINALG_SVD_H
00009 #define SYNAPS_LINALG_SVD_H
00010 #include <synaps/init.h>
00011 #include <synaps/linalg/VectDse.h>
00012 #include <synaps/linalg/MATRIX.m>
00013 
00014 __BEGIN_NAMESPACE_SYNAPS
00015 
00019 
00021 template <class M> inline 
00022 VectDse<typename realof<typename M::value_type>::T> Svd(M & A)
00023 {
00024   using namespace MATRIX;
00025   typedef VectDse<typename realof<typename M::value_type>::T> VT;
00026   VT x(std::min(A.nbcol(),A.nbrow()));
00027   svd(x.rep(),A.rep());  
00028   return x;
00029 }
00030 
00032 template <class M> inline 
00033 VectDse<typename realof<typename M::value_type>::T> Svd(M & A, M & U)
00034 {
00035   typedef VectDse<typename realof<typename M::value_type>::T> VT;
00036   unsigned int l = std::min(A.nbcol(),A.nbrow());
00037   VT x(l);
00038   U.rep().resize(A.nbrow(),A.nbrow());
00039   using namespace MATRIX;  svd(x.rep(),A.rep(), U.rep());
00040   return x;
00041 }
00042 
00046 template <class M> inline
00047 VectDse<typename realof<typename M::value_type>::T> Svd(M & A, M & U, M & V)
00048 {
00049   typedef VectDse<typename realof<typename M::value_type>::T> VT;
00050   unsigned int  m = std::max(A.nbcol(),A.nbrow());
00051   VT x(m);
00052   U.rep().resize(A.nbrow(),A.nbrow());
00053   V.rep().resize(A.nbcol(),A.nbcol());
00054   using namespace MATRIX; svd(x.rep(),A.rep(), U.rep(), V.rep());
00055   return x;
00056 }
00057 
00058 
00063 template <class M> inline 
00064 VectDse<typename realof<typename M::value_type>::T> Svdx(M & A, M & U, M & V)
00065 {
00066   typedef VectDse<realof<typename M::value_type> > VT;
00067   unsigned int l = std::max(A.nbcol(),A.nbrow());
00068   VT x(l);
00069   U.rep().resize(A.nbrow(),A.nbrow());
00070   V.rep().resize(A.nbcol(),A.nbcol());
00071    using namespace MATRIX; svdx(x.rep(), A.rep(), U.rep(), V.rep());
00072   return x;
00073 }
00074 
00075 
00079 template <class M> 
00080 inline typename M::value_type Cond(M & A)
00081 {
00082   typedef typename linalg::rep1d<typename realof<typename M::value_type>::T> VT;
00083   unsigned int l = std::min(A.nbcol(),A.nbrow());
00084   VT S(l);
00085   using namespace MATRIX;  svd(S,A.rep());
00086   return (S[0]/S[l-1]);
00087 }
00088 
00089 __END_NAMESPACE_SYNAPS
00090 
00091 #endif // SYNAPS_LINALG_SVD_H
00092 
00093