synaps/linalg/hankel.h

00001 /*********************************************************************
00002 *      This file is part of the source code of SYNAPS kernel.        *
00003 *   Author(s): B. Mourrain, GALAAD, INRIA                            *
00004 **********************************************************************
00005 History: 
00006 $Id: hankel.h,v 1.1 2005/07/11 08:33:35 mourrain Exp $
00007 **********************************************************************/
00008 #ifndef Hankel_H
00009 #define Hankel_H
00010 
00011 #include <synaps/init.h>
00012 #include <synaps/linalg/rep1d.h>
00013 #include <synaps/base/Range.h>
00014 #include <synaps/linalg/FFT.h>
00015 
00016 __BEGIN_NAMESPACE_SYNAPS
00017 
00018 
00019 template<char O,class A, class B> struct OP;
00020 //OPEN
00021 namespace linalg {
00022 //----------------------------------------------------------------------
00031 template<class C> 
00032 struct hankel : public linalg::rep1d<C> {
00033 
00034   unsigned int nbrow_, nbcol_;
00035 
00036   typedef C           coeff_t;
00037   typedef typename linalg::rep1d<C>::size_type   size_type;
00038   typedef rep1d<C>  row_t;
00039   typedef rep1d<C>  col_t;
00040 
00041   hankel(): rep1d<C>(){}
00042   hankel(const hankel<C> & v): rep1d<C>(v), 
00043     nbrow_(v.nbrow_), nbcol_(v.nbcol_){}
00044   hankel(unsigned int i, unsigned int j): 
00045     rep1d<C>(i+j-1),nbrow_(i),nbcol_(j) {}
00046   hankel(unsigned int i, unsigned int j, C* t): 
00047     rep1d<C>(i+j-1,t),nbrow_(i),nbcol_(j){}
00048 
00049   void resize(unsigned int i, unsigned int j)
00050     {
00051       this->rep1d<C>::resize(i+j-1); nbrow_ = i; nbcol_=j;
00052     }
00053 
00054   //  C &   operator()(unsigned int i, unsigned int j) {return tab_[i+j];} 
00055   C   operator()(unsigned int i, unsigned int j) const 
00056         {return this->tab_[i+j];} 
00057 
00058   size_type nbrow() const {return nbrow_;}
00059   size_type nbcol() const {return nbcol_;}
00060 
00061   void transpose() { std::swap(nbcol_,nbrow_);};
00062 };
00063 //----------------------------------------------------------------------
00064 // template<class C>
00065 // void assign(hankel<C> & r, const hankel<C>* v) 
00066 // {
00067 //   assign((rep1d<C> &)r, (rep1d<C>*) v);
00068 //   r.nbrow_=v->nbrow_;
00069 //   r.nbcol_=v->nbcol_;
00070 // }
00071 //----------------------------------------------------------------------
00072 
00073 template<class C, class M>
00074 void submatrix( hankel<C> & r, const M & m, const Range2d  & rg )
00075 {
00076   typedef typename hankel<C>::size_type size_type;
00077   for(size_type i=rg.j1; i< rg.j2+1; i++)
00078     r[i-rg.j1]=m(rg.i1,i);
00079   for(size_type i=rg.i1+1; i< rg.i2+1; i++)
00080     r[i+rg.j2-rg.j1-rg.i1]=m(i,rg.j2);
00081 }
00082 
00083   //-----------------------------------------------------------------
00084   // Assignment of a matrix to a container {\tt hankel}
00085   template<class S, class C>
00086   inline void assign(hankel<C> & r, S M)
00087   {
00088     for(unsigned int i=0;i<M.nbcol();i++) r(0,i)=M(0,i);  
00089     unsigned int c= M.nbcol()-1;
00090     for(unsigned int i=1;i<M.nbrow();i++) r(i,c)=M(i,c);  
00091   }
00092   //----------------------------------------------------------------------
00097   template<class C,class V> 
00098   void mult_vect(V & r, const hankel<C> & t, const V & v);
00099   
00100 } //CLOSE linalg
00101 
00102 __END_NAMESPACE_SYNAPS
00103 
00104 //-------------------------------------------------------------------
00105 #ifndef SEPARATE_COMPILATION
00106 #include "synaps/linalg/hankel.C"
00107 #endif
00108 //-------------------------------------------------------------------
00109 
00110 #endif //hankel_H
00111 

SYNAPS DOCUMENTATION
logo