// This may look like C code, but it is really -*- C++ -*- // C.Magneville 04/99 #ifndef TMatrix_SEEN #define TMatrix_SEEN #include "machdefs.h" #include "tarray.h" namespace SOPHYA { template class TMatrix : public TArray { public: // Creation / destruction TMatrix(); TMatrix(uint_4 r,uint_4 c, short mm=AutoMemoryMapping); TMatrix(const TMatrix& a); TMatrix(const TMatrix& a, bool share); TMatrix(const TArray& a); TMatrix(const TArray& a, bool share, short mm=CMemoryMapping); virtual ~TMatrix(); // Pour verifiez la compatibilite de dimensions lors de l'affectation virtual TArray& Set(const TArray& a); inline TMatrix& operator = (const TMatrix& a) { Set(a); return(*this); } // Size - Changing the Size inline uint_4 NRows() const {return Size(marowi_); } inline uint_4 NCols() const {return Size(macoli_); } inline uint_4 NCol() const {return Size(macoli_); } // back-compat Peida void ReSize(uint_4 r,uint_4 c, short mm=SameMemoryMapping); // Reallocation de place void Realloc(uint_4 r,uint_4 c, short mm=SameMemoryMapping, bool force=false); // Sub-matrix extraction $CHECK$ Reza 03/2000 Doit-on declarer cette methode const ? TMatrix operator () (Range rline, Range rcol) const ; // Inline element acces methods inline T const& operator()(uint_4 r,uint_4 c) const; inline T& operator()(uint_4 r,uint_4 c); // Operations matricielles TMatrix& Transpose(); //mm = SameMemoryMapping or CMemoryMapping or FortranMemoryMapping TMatrix Transpose(short mm); // Rearranging Matrix Elements TMatrix Rearrange(short mm); // Operateur d'affectation // A = x (matrice diagonale Identite) virtual TMatrix& SetIdentity(IdentityMatrix imx); inline TMatrix& operator = (IdentityMatrix imx) { return SetIdentity(imx); } // Operations diverses avec une constante inline TMatrix& operator = (T x) { Set(x); return(*this); } inline TMatrix& operator += (T x) { Add(x); return(*this); } inline TMatrix& operator -= (T x) { Sub(x); return(*this); } inline TMatrix& operator *= (T x) { Mul(x); return(*this); } inline TMatrix& operator /= (T x) { Div(x); return(*this); } // operations avec matrices inline TMatrix& operator += (const TMatrix& a) { return AddElt(a); } inline TMatrix& operator -= (const TMatrix& a) { return SubElt(a); } // Input-Output virtual void Print(ostream& os, int_4 maxprt=-1, bool si=false) const ; // Produit matriciel TMatrix Multiply(const TMatrix& b, short mm=SameMemoryMapping) const; // inline TMatrix& operator *= (const TMatrix& b) protected: }; // ---- inline acces methods ------ template inline T const& TMatrix::operator()(uint_4 r, uint_4 c) const { #ifdef SO_BOUNDCHECKING if (marowi_ == 0) CheckBound(r, c, 0, 0, 0, 4); else CheckBound(c, r, 0, 0, 0, 4); #endif return ( *( mNDBlock.Begin()+ offset_+ r*step_[marowi_] + c*step_[macoli_] ) ); } template inline T & TMatrix::operator()(uint_4 r, uint_4 c) { #ifdef SO_BOUNDCHECKING if (marowi_ == 0) CheckBound(r, c, 0, 0, 0, 4); else CheckBound(c, r, 0, 0, 0, 4); #endif return ( *( mNDBlock.Begin()+ offset_+ r*step_[marowi_] + c*step_[macoli_] ) ); } // Surcharge d'operateurs C = A * B template inline TMatrix operator * (const TMatrix& a, const TMatrix& b) { TMatrix result(a); result.SetTemp(true); result.Multiply(b); return result;} typedef TMatrix Matrix; } // Fin du namespace #endif