00001 
00002 
00003 
00004 
00005 
00006 
00008 #ifndef SYNAPS_LINALG_RANK_H
00009 #define SYNAPS_LINALG_RANK_H
00010 
00011 #include <synaps/init.h>
00012 #include <synaps/linalg/MATRIX.m>
00013 
00014 __BEGIN_NAMESPACE_SYNAPS
00015 
00016 
00017 
00018 namespace lapack {
00019   template<class R> struct rep;
00020 }
00021 
00025 template<class R> inline
00026 typename R::size_type Rank(const R & m) 
00027 {
00028   using namespace MATRIX;
00029   return rank(m.rep());
00030 }
00031 
00035 template<class R,class MTH> inline
00036 typename R::size_type Rank(const R & m, const MTH& mth) 
00037 {
00038   using MATRIX::rank;
00039   return rank(mth,m.rep());
00040 }
00041 
00047 template<class R,class V> 
00048 typename R::size_type Rank(const R & M, 
00049                            V & I, V & J)
00050 {
00051   lapack::rep<typename R::value_type> A(M.nbrow(),M.nbcol());
00052   assign(A,M);
00053   return rank(A,I.begin(), J.begin());
00054 }
00055 
00062 template<class R,class I> 
00063 R Extract(R & M, const I & ipvt, const I & jpvt, 
00064                 const typename R::size_type & rank)
00065 {
00066    R SM(rank,rank);
00067    for (typename R::size_type i=0; i<rank; i++)
00068      for (typename R::size_type j = 0; j < rank; j++) 
00069        SM(i,j)=M(ipvt[i],jpvt[j]);
00070    return (SM);
00071 }
00072 
00073 __END_NAMESPACE_SYNAPS
00074 
00075 #endif // SYNAPS_LINALG_RANK_H
00076 
00077