Changeset 772 in Sophya for trunk/SophyaLib/TArray/tmatrix.h


Ignore:
Timestamp:
Mar 10, 2000, 4:13:22 PM (26 years ago)
Author:
ansari
Message:

Separation MatrixRC et TMatrix, etc ... - Creation de TArray<T> Reza 10/3/2000

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/TArray/tmatrix.h

    r762 r772  
    1414namespace SOPHYA {
    1515
    16 template <class T> class TVector;
    17 template <class T> class TMatrixRC;
    18 
    1916template <class T>
    2017class TMatrix : public AnyDataObj {
    21   friend class TMatrixRC<T>;
    22   friend class TVector<T>;
    2318public:
    2419
     
    10398  TMatrix<T> Mul(const TMatrix<T>& b) const;
    10499
    105   // Pivot de Gauss : diagonalise la matrice A, en effectuant les memes
    106   // operations sur la matrice B
    107   TMatrix<T> Inverse() const;
    108   static T GausPiv(TMatrix<T>& A, TMatrix<T>& B);
    109 
    110   // Acces aux rangees et colonnes
    111   TMatrixRC<T> Row(uint_4 r) const;
    112   TMatrixRC<T> Col(uint_4 c) const;
    113   TMatrixRC<T> Diag() const;
    114100
    115101protected:
     
    203189{ FIO_TMatrix<T> fio(&obj);  fio.Read(is);  return(is); }
    204190
    205 /////////////////////////////////////////////////////////////////////////
    206 // Classe de lignes/colonnes de matrices
    207 enum TRCKind {TmatrixRow=0, TmatrixCol=1, TmatrixDiag=2};
    208 template <class T>
    209 class TMatrixRC {
    210   friend class TVector<T>;
    211   friend class TMatrix<T>;
    212 public:
    213   TMatrixRC();
    214 
    215   virtual ~TMatrixRC() {}
    216 
    217   int_4 Next();
    218   int_4 Prev();
    219   int_4 SetCol(int_4 c);
    220   int_4 SetRow(int_4 r);
    221   int_4 SetDiag();
    222 
    223   static uint_4 Step(const TMatrix<T>& m, TRCKind rckind);
    224   static T* Org(const TMatrix<T>&, TRCKind rckind, uint_4 ind=0);
    225 
    226   TRCKind Kind() const { return kind; }
    227   uint_4 NElts() const;
    228   T& operator()(uint_4 i);
    229   T  operator()(uint_4 i) const;
    230 
    231   TMatrixRC<T>& operator = (const TMatrixRC<T>& rc);
    232   TVector<T> GetVect() const;
    233 
    234   TMatrixRC<T>& operator += (const TMatrixRC<T>& rc);
    235   TMatrixRC<T>& operator -= (const TMatrixRC<T>& rc);
    236 
    237   TMatrixRC<T>& operator *= (T x);
    238   TMatrixRC<T>& operator /= (T x);
    239   TMatrixRC<T>& operator -= (T x);
    240   TMatrixRC<T>& operator += (T x);
    241 
    242   TMatrixRC<T>& LinComb(T a, T b, const TMatrixRC& rc, uint_4 first=0);
    243   TMatrixRC<T>& LinComb(T b, const TMatrixRC<T>& rc, uint_4 first=0);
    244 
    245   uint_4 IMaxAbs(uint_4 first=0);
    246 
    247   static void Swap(TMatrixRC<T>& rc1, TMatrixRC<T>& rc2);
    248 
    249 protected:
    250   TMatrixRC(TMatrix<T>& m, TRCKind kind, uint_4 index=0);
    251   TMatrix<T>* matrix;
    252   inline static double Abs_Value(uint_1 v) {return (double) v;}
    253   inline static double Abs_Value(uint_2 v) {return (double) v;}
    254   inline static double Abs_Value(int_2 v)  {return (v>0)? (double) v: (double) -v;}
    255   inline static double Abs_Value(int_4 v)  {return (v>0)? (double) v: (double) -v;}
    256   inline static double Abs_Value(int_8 v)  {return (v>0)? (double) v: (double) -v;}
    257   inline static double Abs_Value(uint_4 v) {return (double) v;}
    258   inline static double Abs_Value(uint_8 v) {return (double) v;}
    259   inline static double Abs_Value(r_4 v)    {return (double) fabsf(v);}
    260   inline static double Abs_Value(r_8 v)    {return fabs(v);}
    261   inline static double Abs_Value(complex<float> v)
    262                 {return sqrt(v.real()*v.real()+v.imag()*v.imag());}
    263   inline static double Abs_Value(complex<double> v)
    264                 {return sqrt(v.real()*v.real()+v.imag()*v.imag());}
    265 
    266   T*          data;
    267   int_4       index;
    268   uint_4      step;
    269   TRCKind     kind;
    270 };
    271 
    272 
    273 template <class T>
    274 inline T operator * (const TMatrixRC<T>& a, const TMatrixRC<T>& b)
    275   {
    276   if ( a.NElts() != b.NElts() )
    277     throw(SzMismatchError("TMatrixRC::operator * size mismatch\n"));
    278   if ( a.Kind() != b.Kind() )
    279     throw(SzMismatchError("TMatrixRC::operator * type mismatch\n"));
    280   T sum = 0;
    281   for(uint_4 i=0; i<a.NElts(); i++) sum += a(i)*b(i);
    282   return sum;
    283   }
    284 
    285 template <class T>
    286 inline uint_4 TMatrixRC<T>::Step(const TMatrix<T>& m, TRCKind rckind)
    287   { switch (rckind) { case TmatrixRow  : return 1;
    288                       case TmatrixCol  : return m.mNc;
    289                       case TmatrixDiag : return m.mNc+1; }
    290     return 0; }
    291 
    292 template <class T>
    293 inline T* TMatrixRC<T>::Org(const TMatrix<T>& m, TRCKind rckind, uint_4 index)
    294   { switch (rckind) { case TmatrixRow  : return const_cast<T *>(m.Data()) + index * m.mNc;
    295                       case TmatrixCol  : return const_cast<T *>(m.Data()) + index;
    296                       case TmatrixDiag : return const_cast<T *>(m.Data()); }
    297     return NULL; }
    298 
    299 template <class T> inline uint_4 TMatrixRC<T>::NElts() const
    300   { if (!matrix) return 0;
    301     switch (kind) { case TmatrixRow  : return matrix->mNc;
    302                     case TmatrixCol  : return matrix->mNr;
    303                     case TmatrixDiag : return matrix->mNc; }
    304     return 0; }
    305 
    306 template <class T>
    307 inline T& TMatrixRC<T>::operator()(uint_4 i) {return data[i*step];}
    308 template <class T>
    309 inline T  TMatrixRC<T>::operator()(uint_4 i) const {return data[i*step];}
    310 
    311 ////////////////////////////////////////////////////////////////
    312 // Typedef pour simplifier et compatibilite Peida
    313 typedef TMatrixRC<r_8> MatrixRC;
    314191
    315192} // Fin du namespace
Note: See TracChangeset for help on using the changeset viewer.