Changeset 804 in Sophya for trunk/SophyaLib/TArray/tmatrix.h
- Timestamp:
- Apr 3, 2000, 7:36:01 PM (25 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/TArray/tmatrix.h
r772 r804 5 5 6 6 #include "machdefs.h" 7 #include <stdio.h> 8 #include <iostream.h> 9 #include <complex> 10 #include "ppersist.h" 11 #include "anydataobj.h" 12 #include "ndatablock.h" 7 #include "tarray.h" 13 8 14 9 namespace SOPHYA { 15 10 16 11 template <class T> 17 class TMatrix : public AnyDataObj{12 class TMatrix : public TArray<T> { 18 13 public: 19 20 14 // Creation / destruction 21 15 TMatrix(); 22 TMatrix(uint_4 r,uint_4 c); 23 TMatrix(uint_4 r,uint_4 c,T* values,Bridge* br=NULL); 16 TMatrix(uint_4 r,uint_4 c, short mm=AutoMemoryMapping); 24 17 TMatrix(const TMatrix<T>& a); 25 TMatrix(const TMatrix<T>& a,bool share); 18 TMatrix(const TMatrix<T>& a, bool share); 19 TMatrix(const TArray<T>& a); 20 TMatrix(const TArray<T>& a, bool share, short mm=CMemoryMapping); 26 21 virtual ~TMatrix(); 27 22 28 // Temporaire? 29 inline bool IsTemp(void) const {return mNDBlock.IsTemp();} 30 inline void SetTemp(bool temp=false) const {mNDBlock.SetTemp(temp);} 23 // Pour verifiez la compatibilite de dimensions lors de l'affectation 24 virtual TArray<T>& Set(const TArray<T>& a); 25 inline TMatrix<T>& operator = (const TMatrix<T>& a) 26 { Set(a); return(*this); } 31 27 32 // Gestion taille/Remplissage 33 inline void Clone(const TMatrix<T>& a) // Clone: copie des donnees de "a" 34 {mNDBlock.Clone(a.mNDBlock); mNr = a.mNr; mNc = a.mNc;} 35 inline void Reset(T v=0) {mNDBlock.Reset(v);} 36 inline void ReSize(uint_4 r,uint_4 c) // Reallocation de place 37 {if(r==0||c==0) throw(SzMismatchError("TMatrix::ReSize r ou c==0\n")); 38 mNDBlock.ReSize(r*c); mNr = r; mNc = c;} 39 inline void Realloc(uint_4 r,uint_4 c,bool force=false) 40 {if(r==0||c==0) throw(SzMismatchError("TMatrix::Realloc r ou c==0\n")); 41 mNDBlock.Realloc(r*c,force); mNr = r; mNc = c;} 28 // Size - Changing the Size 29 inline uint_4 NRows() const {return Size(marowi_); } 30 inline uint_4 NCols() const {return Size(macoli_); } 31 inline uint_4 NCol() const {return Size(macoli_); } // back-compat Peida 42 32 43 // Informations pointeur/data 44 inline uint_4 NRows() const {return mNr;} 45 inline uint_4 NCols() const {return mNc;} 46 inline uint_4 NCol() const {return mNc;} // back-compat Peida 47 inline T const& operator()(uint_4 r,uint_4 c) const 48 {return *(mNDBlock.Begin()+r*mNc+c);} 49 inline T& operator()(uint_4 r,uint_4 c) 50 {return *(mNDBlock.Begin()+r*mNc+c);} 51 inline T const& operator[](uint_4 ip) const 52 {return *(mNDBlock.Begin()+ip);} 53 inline T& operator[](uint_4 ip) 54 {return *(mNDBlock.Begin()+ip);} 55 inline T* Data() {return mNDBlock.Begin();} 56 inline const T* Data() const {return mNDBlock.Begin();} 57 inline NDataBlock<T>& DataBlock() {return mNDBlock;} 58 inline const NDataBlock<T>& DataBlock() const {return mNDBlock;} 33 void ReSize(uint_4 r,uint_4 c, short mm=SameMemoryMapping); // Reallocation de place 34 void Realloc(uint_4 r,uint_4 c, short mm=SameMemoryMapping, bool force=false); 35 36 // Sub-matrix extraction $CHECK$ Reza 03/2000 Doit-on declarer cette methode const ? 37 TMatrix<T> operator () (Range rline, Range rcol) const ; 38 39 // Inline element acces methods 40 inline T const& operator()(uint_4 r,uint_4 c) const; 41 inline T& operator()(uint_4 r,uint_4 c); 59 42 60 43 // Operations matricielles 61 TMatrix<T> Transpose(void) const; 44 TMatrix<T>& Transpose(); 45 //mm = SameMemoryMapping or CMemoryMapping or FortranMemoryMapping 46 TMatrix<T> Transpose(short mm); 47 // Rearranging Matrix Elements 48 TMatrix<T> Rearrange(short mm); 62 49 63 50 // Operateur d'affectation 64 // A = x (matrice diagonale x*Identite) 65 inline TMatrix<T>& operator = (T x) 66 {if(mNr!=mNc || mNr==0) throw(SzMismatchError("TMatrix::operator= mNc!=mNr ou ==0\n")); 67 for(uint_4 r=0;r<mNr;r++) for(uint_4 c=0;c<mNc;c++) (*this)(r,c)=(r==c)?x:(T)0; 68 return *this;} 69 // A = B : partage les donnees si "a" est temporaire, clone sinon. 70 inline TMatrix<T>& operator = (const TMatrix<T>& a) 71 {if(this == &a) return *this; CloneOrShare(a); return *this;} 51 // A = x (matrice diagonale Identite) 52 virtual TMatrix<T>& SetIdentity(IdentityMatrix imx); 53 inline TMatrix<T>& operator = (IdentityMatrix imx) { return SetIdentity(imx); } 72 54 73 // Impression 74 void Print(ostream& os,int lp=0,uint_4 i0=0,uint_4 ni=10,uint_4 j0=0,uint_4 nj=10) const; 75 inline void Print(int lp=0,uint_4 i0=0,uint_4 ni=10,uint_4 j0=0,uint_4 nj=10) const 76 {Print(cout,lp,i0,ni,j0,nj);} 55 // Operations diverses avec une constante 56 inline TMatrix<T>& operator = (T x) { Set(x); return(*this); } 57 inline TMatrix<T>& operator += (T x) { Add(x); return(*this); } 58 inline TMatrix<T>& operator -= (T x) { Sub(x); return(*this); } 59 inline TMatrix<T>& operator *= (T x) { Mul(x); return(*this); } 60 inline TMatrix<T>& operator /= (T x) { Div(x); return(*this); } 77 61 78 // Surcharge d'operateurs INPLACE: A (+=,-=,*=,/=) (T) x 79 inline TMatrix<T>& operator += (T b) {mNDBlock += b; return *this;} 80 inline TMatrix<T>& operator -= (T b) {mNDBlock -= b; return *this;} 81 inline TMatrix<T>& operator *= (T b) {mNDBlock *= b; return *this;} 82 inline TMatrix<T>& operator /= (T b) {mNDBlock /= b; return *this;} 62 // operations avec matrices 63 inline TMatrix<T>& operator += (const TMatrix<T>& a) { return AddElt(a); } 64 inline TMatrix<T>& operator -= (const TMatrix<T>& a) { return SubElt(a); } 83 65 84 // Surcharge d'operateurs INPLACE: A (+=,-=,*=,/=) B 85 inline TMatrix<T>& operator += (const TMatrix<T>& a) 86 {if(mNr==0 || mNc==0 || mNr!=a.mNr || mNc!=a.mNc) 87 throw(SzMismatchError("TMatrix::operator+=A size mismatch")); 88 mNDBlock += a.mNDBlock; return *this;} 89 inline TMatrix<T>& operator -= (const TMatrix<T>& a) 90 {if(mNr==0 || mNc==0 || mNr!=a.mNr || mNc!=a.mNc) 91 throw(SzMismatchError("TMatrix::operator-=A size mismatch")); 92 mNDBlock -= a.mNDBlock; return *this;} 93 TMatrix<T>& operator *= (const TMatrix<T>& a); 66 // Input-Output 67 virtual void Print(ostream& os, int_4 maxprt=-1, bool si=false) const ; 94 68 95 // Pour surcharge d'operateurs C = A (+,-,*) B 96 TMatrix<T> Add(const TMatrix<T>& b) const; 97 TMatrix<T> Sub(const TMatrix<T>& b) const; 98 TMatrix<T> Mul(const TMatrix<T>& b) const; 69 // Produit matriciel 70 TMatrix<T> Multiply(const TMatrix<T>& b, short mm=SameMemoryMapping) const; 71 // inline TMatrix<T>& operator *= (const TMatrix<T>& b) 72 73 protected: 74 }; 75 76 // ---- inline acces methods ------ 77 template <class T> 78 inline T const& TMatrix<T>::operator()(uint_4 r, uint_4 c) const 79 { 80 #ifdef SO_BOUNDCHECKING 81 if (marowi_ == 0) CheckBound(r, c, 0, 0, 0, 4); 82 else CheckBound(c, r, 0, 0, 0, 4); 83 #endif 84 return ( *( mNDBlock.Begin()+ offset_+ 85 r*step_[marowi_] + c*step_[macoli_] ) ); 86 } 87 88 template <class T> 89 inline T & TMatrix<T>::operator()(uint_4 r, uint_4 c) 90 { 91 #ifdef SO_BOUNDCHECKING 92 if (marowi_ == 0) CheckBound(r, c, 0, 0, 0, 4); 93 else CheckBound(c, r, 0, 0, 0, 4); 94 #endif 95 return ( *( mNDBlock.Begin()+ offset_+ 96 r*step_[marowi_] + c*step_[macoli_] ) ); 97 } 99 98 100 99 101 protected: 102 // partage les donnees si "a" temporaire, clone sinon. 103 inline void CloneOrShare(const TMatrix<T>& a) 104 {mNDBlock.CloneOrShare(a.mNDBlock); mNr=a.mNr; mNc=a.mNc;} 105 // Share: partage les donnees de "a" 106 inline void Share(const TMatrix<T>& a) 107 {mNDBlock.Share(a.mNDBlock); mNr=a.mNr; mNc=a.mNc;} 100 // Surcharge d'operateurs C = A * B 108 101 109 uint_4 mNr,mNc; 110 NDataBlock<T> mNDBlock; 111 }; 102 template <class T> inline TMatrix<T> operator * (const TMatrix<T>& a, const TMatrix<T>& b) 103 { TMatrix<T> result(a); result.SetTemp(true); result.Multiply(b); return result;} 112 104 113 ////////////////////////////////////////////////////////////////114 // Impression115 116 template <class T>117 inline ostream& operator << (ostream& os, const TMatrix<T>& a)118 {a.Print(os); return(os);}119 120 ////////////////////////////////////////////////////////////////121 // Surcharge d'operateurs A (+,-,*,/) (T) x122 123 template <class T> inline TMatrix<T> operator + (const TMatrix<T>& a, T b)124 {TMatrix<T> result(a); result.SetTemp(true); result += b; return result;}125 126 template <class T> inline TMatrix<T> operator + (T b,const TMatrix<T>& a)127 {TMatrix<T> result(a); result.SetTemp(true); result += b; return result;}128 129 template <class T> inline TMatrix<T> operator - (const TMatrix<T>& a, T b)130 {TMatrix<T> result(a); result.SetTemp(true); result -= b; return result;}131 132 template <class T> inline TMatrix<T> operator - (T b,const TMatrix<T>& a)133 {TMatrix<T> result(a); result.SetTemp(true);134 result.DataBlock() = b-result.DataBlock(); return result;}135 136 template <class T> inline TMatrix<T> operator * (const TMatrix<T>& a, T b)137 {TMatrix<T> result(a); result.SetTemp(true); result *= b; return result;}138 139 template <class T> inline TMatrix<T> operator * (T b,const TMatrix<T>& a)140 {TMatrix<T> result(a); result.SetTemp(true); result *= b; return result;}141 142 template <class T> inline TMatrix<T> operator / (const TMatrix<T>& a, T b)143 {TMatrix<T> result(a); result.SetTemp(true); result /= b; return result;}144 145 ////////////////////////////////////////////////////////////////146 // Surcharge d'operateurs C = A (+,-,*,/) B147 148 template <class T>149 inline TMatrix<T> operator + (const TMatrix<T>& a,const TMatrix<T>& b)150 {return a.Add(b);}151 152 template <class T>153 inline TMatrix<T> operator - (const TMatrix<T>& a,const TMatrix<T>& b)154 {return a.Sub(b);}155 156 template <class T>157 inline TMatrix<T> operator * (const TMatrix<T>& a,const TMatrix<T>& b)158 {return a.Mul(b);}159 160 ////////////////////////////////////////////////////////////////161 // Typedef pour simplifier et compatibilite Peida162 105 typedef TMatrix<r_8> Matrix; 163 164 /////////////////////////////////////////////////////////////////////////165 // Classe pour la gestion de persistance166 template <class T>167 class FIO_TMatrix : public PPersist {168 public:169 FIO_TMatrix();170 FIO_TMatrix(string const & filename);171 FIO_TMatrix(const TMatrix<T> & obj);172 FIO_TMatrix(TMatrix<T> * obj);173 virtual ~FIO_TMatrix();174 virtual AnyDataObj* DataObj();175 virtual void SetDataObj(AnyDataObj & o);176 inline operator TMatrix<T>() { return(*dobj); }177 protected :178 virtual void ReadSelf(PInPersist&);179 virtual void WriteSelf(POutPersist&) const;180 TMatrix<T> * dobj;181 bool ownobj;182 };183 184 template <class T>185 inline POutPersist& operator << (POutPersist& os, TMatrix<T> & obj)186 { FIO_TMatrix<T> fio(&obj); fio.Write(os); return(os); }187 template <class T>188 inline PInPersist& operator >> (PInPersist& is, TMatrix<T> & obj)189 { FIO_TMatrix<T> fio(&obj); fio.Read(is); return(is); }190 191 106 192 107 } // Fin du namespace
Note:
See TracChangeset
for help on using the changeset viewer.