Changeset 288 in Sophya for trunk/SophyaLib/NTools/tmatrix.cc
- Timestamp:
- May 3, 1999, 6:55:25 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/NTools/tmatrix.cc
r286 r288 1 // $Id: tmatrix.cc,v 1. 2 1999-04-30 11:02:52 ansari Exp $1 // $Id: tmatrix.cc,v 1.3 1999-05-03 16:55:22 ansari Exp $ 2 2 // C.Magneville 04/99 3 3 #include "machdefs.h" … … 13 13 14 14 //////////////////////////////////////////////////////////////// 15 //**** ******** Createur, Destructeur, gestion des donnees15 //**** Createur, Destructeur 16 16 17 17 template <class T> … … 39 39 template <class T> 40 40 TMatrix<T>::TMatrix(const TMatrix<T>& a) 41 // Constructeur par copie (partage des donnees).41 // Constructeur par copie (partage si "a" temporaire). 42 42 : mNr(a.mNr), mNc(a.mNc), mNDBlock(a.mNDBlock) 43 43 { … … 46 46 template <class T> 47 47 TMatrix<T>::TMatrix(const TMatrix<T>& a,bool share) 48 // Constructeur par copie .48 // Constructeur par copie avec possibilite de forcer le partage ou non. 49 49 : mNr(a.mNr), mNc(a.mNc), mNDBlock(a.mNDBlock,share) 50 50 { … … 58 58 59 59 //////////////////////////////////////////////////////////////// 60 template <class T> 61 void TMatrix<T>::Clone(const TMatrix<T>& a) 62 // Clone (copie de donnees) a partir de "a" 63 // Partage des donnees si "a" est temporaire. 64 { 65 mNDBlock.Clone(a.mNDBlock); mNr = a.mNr; mNc = a.mNc; 66 } 67 68 template <class T> 69 void TMatrix<T>::Reset(T v) 70 // Reset de la matrice a "v" 71 { 72 mNDBlock.Reset(v); 73 } 74 75 template <class T> 76 void TMatrix<T>::Realloc(uint_4 r,uint_4 c,bool force_alloc) 77 // Reallocation de place 78 { 79 if(r==0 || c==0) throw(SzMismatchError("TMatrix::ReSize r ou c==0\n")); 80 if(!force_alloc && mNr==r && mNc==c) return; 81 mNr = r; mNc = c; mNDBlock.ReSize(r*c,force_alloc); 82 } 83 84 //////////////////////////////////////////////////////////////// 85 //**** Surcharge de TMatrix=TMatrix; TMatrix=<T> b; 86 87 template <class T> 88 TMatrix<T>& TMatrix<T>::operator = (T x) 89 // Operateur d'affectation depuis scalaire : identite * scalaire. 90 { 91 if(mNr!=mNc || mNr==0) 92 throw(SzMismatchError("TMatrix::operator= mNc!=mNr ou ==0\n")); 93 for(uint_4 r=0;r<mNr;r++) for(uint_4 c=0;c<mNc;c++) 94 (*this)(r,c) = (r==c)? x: 0; 95 return *this; 96 } 97 98 template <class T> 99 TMatrix<T>& TMatrix<T>::operator = (const TMatrix<T>& a) 100 // Operateur d'affectation A=a 101 // (Re)allocation de la place memoire 102 // sauf si "a" est cree temporairement (partage) 103 { 104 if(this == &a) return *this; 105 Clone(a); 106 return *this; 60 // Operations matricielles 61 template <class T> 62 TMatrix<T> TMatrix<T>::Transpose(void) const 63 // Transposition 64 { 65 TMatrix<T> a; a.Clone(*this); a.SetTemp(true); 66 a.mNr = mNc; a.mNc = mNr; 67 {for(int i=0; i<mNr; i++) 68 for(int j=0; j<mNc; j++) { 69 a(j,i) = (*this)(i,j); 70 }} 71 return a; 107 72 } 108 73 … … 115 80 // Impression de la sous-matrice (i:i+ni-1,i:j+nj-1) 116 81 { 117 82 os<<"TMatrix::Print("<<mNr<<","<<mNc<<")"<<endl; 118 83 if(lp>0) 119 84 {os<<" this="<<this<<endl; mNDBlock.Print(0,0);} … … 129 94 130 95 //////////////////////////////////////////////////////////////// 131 //**** Surcharge de +=,-=,*=,/= (INPLACE): TMatrix += <T> b; 132 133 template <class T> 134 TMatrix<T>& TMatrix<T>::operator += (T b) 135 { 136 mNDBlock += b; 137 return *this; 138 } 139 140 template <class T> 141 TMatrix<T>& TMatrix<T>::operator -= (T b) 142 { 143 mNDBlock -= b; 144 return *this; 145 } 146 147 template <class T> 148 TMatrix<T>& TMatrix<T>::operator *= (T b) 149 { 150 mNDBlock *= b; 151 return *this; 152 } 153 154 template <class T> 155 TMatrix<T>& TMatrix<T>::operator /= (T b) 156 { 157 mNDBlock /= b; 158 return *this; 159 } 160 161 //////////////////////////////////////////////////////////////// 162 //**** Surcharge de +=,-=,*= (INPLACE): TMatrix += TMatrix; 163 164 template <class T> 165 TMatrix<T>& TMatrix<T>::operator += (const TMatrix<T>& a) 166 { 167 if(mNr==0 || mNc==0 || mNr!=a.mNr || mNc!=a.mNc) 168 throw(SzMismatchError("TMatrix::operator+=A size mismatch")); 169 mNDBlock += a.mNDBlock; 170 return *this; 171 } 172 173 template <class T> 174 TMatrix<T>& TMatrix<T>::operator -= (const TMatrix<T>& a) 175 { 176 if(mNr==0 || mNc==0 || mNr!=a.mNr || mNc!=a.mNc) 177 throw(SzMismatchError("TMatrix::operator-=A size mismatch")); 178 mNDBlock -= a.mNDBlock; 179 return *this; 180 } 96 //**** Surcharge de *= (INPLACE): TMatrix *= TMatrix; 181 97 182 98 template <class T> … … 209 125 210 126 //////////////////////////////////////////////////////////////// 211 //**** Surcharge de +,-,*: TMatrix = TMatrix + TMatrix; 212 213 template <class T> 214 TMatrix<T> TMatrix<T>::Add(const TMatrix<T>& b) const 215 // C = A(this)+B 127 //**** Pour surcharge d'operateurs C = A (+,-,*,/) B 128 129 template <class T> TMatrix<T> TMatrix<T>::Add(const TMatrix<T>& b) const 216 130 { 217 131 if(mNr!=b.mNr || mNc!=b.mNc) 218 throw(SzMismatchError("NDataBlock operator C=A+B size mismatch\n")); 219 TMatrix<T> result; result.SetTemp(true); 220 if(b.IsTemp()) { 221 result.Clone(b); 222 result += *this; 223 } else { 224 result.Clone(*this); 225 result += b; 226 } 132 throw(SzMismatchError("NDataBlock operator C=A+B size mismatch\n")); 133 TMatrix<T> result; result.SetTemp(true); result.mNr=mNr; result.mNc=mNc; 134 result.mNDBlock = mNDBlock+b.mNDBlock; 227 135 return result; 228 136 } 229 137 230 template <class T> 231 TMatrix<T> TMatrix<T>::Sub(const TMatrix<T>& b) const 232 // C = A(this)-B 138 template <class T> TMatrix<T> TMatrix<T>::Sub(const TMatrix<T>& b) const 233 139 { 234 140 if(mNr!=b.mNr || mNc!=b.mNc) 235 throw(SzMismatchError("NDataBlock operator C=A-B size mismatch\n")); 236 TMatrix<T> result; result.SetTemp(true); 237 if(b.IsTemp()) { 238 result.Clone(b); 239 result.mNDBlock = (*this).mNDBlock - result.mNDBlock; 240 } else { 241 result.Clone(*this); 242 result -= b; 243 } 141 throw(SzMismatchError("NDataBlock operator C=A-B size mismatch\n")); 142 TMatrix<T> result; result.SetTemp(true); result.mNr=mNr; result.mNc=mNc; 143 result.mNDBlock = mNDBlock-b.mNDBlock; 244 144 return result; 245 145 } 246 146 247 template <class T> 248 TMatrix<T> TMatrix<T>::Mul(const TMatrix<T>& b) const 147 template <class T> TMatrix<T> TMatrix<T>::Mul(const TMatrix<T>& b) const 249 148 // C = A(this)*B : Cij = Aik Bkj (allocation forcee dans tous les cas) 250 149 { 251 150 if(mNr==0 || mNc==0 || b.mNc==0 || mNc!=b.mNr) 252 151 throw(SzMismatchError("NDataBlock operator C=A*B size mismatch\n")); 253 TMatrix<T> r; r.SetTemp(true); r.Re alloc(mNr,b.mNc,true);152 TMatrix<T> r; r.SetTemp(true); r.ReSize(mNr,b.mNc); 254 153 T *ai,*aik,*bj,*bkj,*ri,*rij; 255 154 for(ri=const_cast<T *>(r.Data()),ai=const_cast<T *>(Data()); … … 317 216 is.Get(itab,2); 318 217 if (dobj == NULL) dobj = new TMatrix<T>(itab[0],itab[1]); 319 else dobj->Re alloc(itab[0],itab[1],false);218 else dobj->ReSize(itab[0],itab[1]); 320 219 // On lit le NDataBlock 321 220 //cmv encore des problemes avec les consteries … … 331 230 uint_4 itab[2]; 332 231 itab[0] = dobj->NRows(); 333 itab[1] = dobj->NCol ();232 itab[1] = dobj->NCols(); 334 233 os.Put(itab,2); 335 234 // On ecrit le NDataBlock
Note:
See TracChangeset
for help on using the changeset viewer.