// 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 #include #include "ppersist.h" #include "anydataobj.h" #include "ndatablock.h" namespace PlanckDPC { template class TMatrix : public AnyDataObj { public: // Creation / destruction TMatrix(); TMatrix(uint_4 r,uint_4 c); TMatrix(uint_4 r,uint_4 c,T* values,Bridge* br=NULL); TMatrix(const TMatrix& a); TMatrix(const TMatrix& a,bool share); virtual ~TMatrix(); // Temporaire? inline bool IsTemp(void) const {return mNDBlock.IsTemp();} inline void SetTemp(bool temp=false) const {mNDBlock.SetTemp(temp);} // Gestion taille/Remplissage inline void Clone(const TMatrix& a) // Clone: copie des donnees de "a" {mNDBlock.Clone(a.mNDBlock); mNr = a.mNr; mNc = a.mNc;} inline void Reset(T v=0) {mNDBlock.Reset(v);} inline void ReSize(uint_4 r,uint_4 c) // Reallocation de place {if(r==0||c==0) throw(SzMismatchError("TMatrix::ReSize r ou c==0\n")); mNr = r; mNc = c; mNDBlock.ReSize(r*c);} // Informations pointeur/data inline int NRows() const {return mNr;} inline int NCols() const {return mNc;} inline T const& operator()(uint_4 r,uint_4 c) const {return *(mNDBlock.Begin()+r*mNc+c);} inline T& operator()(uint_4 r,uint_4 c) {return *(mNDBlock.Begin()+r*mNc+c);} inline T const& operator[](uint_4 ip) const {return *(mNDBlock.Begin()+ip);} inline T& operator[](uint_4 ip) {return *(mNDBlock.Begin()+ip);} inline T* Data() {return mNDBlock.Begin();} inline const T* Data() const {return mNDBlock.Begin();} inline NDataBlock& DataBlock() {return mNDBlock;} inline const NDataBlock& DataBlock() const {return mNDBlock;} // Operations matricielles TMatrix Transpose(void) const; // Operateur d'affectation // A = x (matrice diagonale x*Identite) inline TMatrix& operator = (T x) {if(mNr!=mNc || mNr==0) throw(SzMismatchError("TMatrix::operator= mNc!=mNr ou ==0\n")); for(uint_4 r=0;r& operator = (const TMatrix& a) {if(this == &a) return *this; CloneOrShare(a); return *this;} // Impression void Print(ostream& os,int lp=0,uint_4 i0=0,uint_4 ni=10,uint_4 j0=0,uint_4 nj=10) const; inline void Print(int lp=0,uint_4 i0=0,uint_4 ni=10,uint_4 j0=0,uint_4 nj=10) const {Print(cout,lp,i0,ni,j0,nj);} // Surcharge d'operateurs INPLACE: A (+=,-=,*=,/=) (T) x inline TMatrix& operator += (T b) {mNDBlock += b; return *this;} inline TMatrix& operator -= (T b) {mNDBlock -= b; return *this;} inline TMatrix& operator *= (T b) {mNDBlock *= b; return *this;} inline TMatrix& operator /= (T b) {mNDBlock /= b; return *this;} // Surcharge d'operateurs INPLACE: A (+=,-=,*=,/=) B inline TMatrix& operator += (const TMatrix& a) {if(mNr==0 || mNc==0 || mNr!=a.mNr || mNc!=a.mNc) throw(SzMismatchError("TMatrix::operator+=A size mismatch")); mNDBlock += a.mNDBlock; return *this;} inline TMatrix& operator -= (const TMatrix& a) {if(mNr==0 || mNc==0 || mNr!=a.mNr || mNc!=a.mNc) throw(SzMismatchError("TMatrix::operator-=A size mismatch")); mNDBlock -= a.mNDBlock; return *this;} TMatrix& operator *= (const TMatrix& a); // Pour surcharge d'operateurs C = A (+,-,*) B TMatrix Add(const TMatrix& b) const; TMatrix Sub(const TMatrix& b) const; TMatrix Mul(const TMatrix& b) const; protected: // partage les donnees si "a" temporaire, clone sinon. inline void CloneOrShare(const TMatrix& a) {mNDBlock.CloneOrShare(a.mNDBlock); mNr=a.mNr; mNc=a.mNc;} // Share: partage les donnees de "a" inline void Share(const TMatrix& a) {mNDBlock.Share(a.mNDBlock); mNr=a.mNr; mNc=a.mNc;} uint_4 mNr,mNc; NDataBlock mNDBlock; }; //////////////////////////////////////////////////////////////// // Impression template inline ostream& operator << (ostream& os, const TMatrix& a) {a.Print(os); return(os);} //////////////////////////////////////////////////////////////// // Surcharge d'operateurs A (+=,-=,*=,/=) (T) x template inline TMatrix operator + (const TMatrix& a, T b) {TMatrix result(a); result.SetTemp(true); result += b; return result;} template inline TMatrix operator + (T b,const TMatrix& a) {TMatrix result(a); result.SetTemp(true); result += b; return result;} template inline TMatrix operator - (const TMatrix& a, T b) {TMatrix result(a); result.SetTemp(true); result -= b; return result;} template inline TMatrix operator - (T b,const TMatrix& a) {TMatrix result(a); result.SetTemp(true); result.DataBlock() = b-result.DataBlock(); return result;} template inline TMatrix operator * (const TMatrix& a, T b) {TMatrix result(a); result.SetTemp(true); result *= b; return result;} template inline TMatrix operator * (T b,const TMatrix& a) {TMatrix result(a); result.SetTemp(true); result *= b; return result;} template inline TMatrix operator / (const TMatrix& a, T b) {TMatrix result(a); result.SetTemp(true); result /= b; return result;} //////////////////////////////////////////////////////////////// // Surcharge d'operateurs C = A (+,-,*,/) B template inline TMatrix operator + (const TMatrix& a,const TMatrix& b) {return a.Add(b);} template inline TMatrix operator - (const TMatrix& a,const TMatrix& b) {return a.Sub(b);} template inline TMatrix operator * (const TMatrix& a,const TMatrix& b) {return a.Mul(b);} ///////////////////////////////////////////////////////////////////////// // Classe pour la gestion de persistance template class FIO_TMatrix : public PPersist { public: FIO_TMatrix(); FIO_TMatrix(string const & filename); FIO_TMatrix(const TMatrix & obj); FIO_TMatrix(TMatrix * obj); virtual ~FIO_TMatrix(); virtual AnyDataObj* DataObj(); inline operator TMatrix() { return(*dobj); } protected : virtual void ReadSelf(PInPersist&); virtual void WriteSelf(POutPersist&) const; TMatrix * dobj; bool ownobj; }; } // Fin du namespace #endif