Changeset 286 in Sophya
- Timestamp:
- Apr 30, 1999, 1:02:52 PM (26 years ago)
- Location:
- trunk/SophyaLib/NTools
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/NTools/tmatrix.cc
r279 r286 1 // $Id: tmatrix.cc,v 1. 1 1999-04-29 08:57:15ansari Exp $1 // $Id: tmatrix.cc,v 1.2 1999-04-30 11:02:52 ansari Exp $ 2 2 // C.Magneville 04/99 3 3 #include "machdefs.h" … … 18 18 TMatrix<T>::TMatrix() 19 19 // Constructeur par defaut. 20 : mNr(0), mNc(0), mNDBlock( NULL)20 : mNr(0), mNc(0), mNDBlock() 21 21 { 22 22 } … … 25 25 TMatrix<T>::TMatrix(uint_4 r,uint_4 c) 26 26 // Construit une matrice de r lignes et c colonnes. 27 : mNr(r), mNc(c), mNDBlock( new NDataBlock<T>(r*c))27 : mNr(r), mNc(c), mNDBlock(r*c) 28 28 { 29 29 } … … 33 33 // Construit une matrice de r lignes et c colonnes. On fournit 34 34 // le tableau des valeurs et eventuellement un Bridge. 35 : mNr(r), mNc(c), mNDBlock( new NDataBlock<T>(r*c,values,br))35 : mNr(r), mNc(c), mNDBlock(r*c,values,br) 36 36 { 37 37 } … … 39 39 template <class T> 40 40 TMatrix<T>::TMatrix(const TMatrix<T>& a) 41 // Constructeur par copie. 42 : mNr(a.mNr), mNc(a.mNc) 43 , mNDBlock(new NDataBlock<T>(*(a.DataBlock()))) 41 // Constructeur par copie (partage des donnees). 42 : mNr(a.mNr), mNc(a.mNc), mNDBlock(a.mNDBlock) 44 43 { 45 44 } … … 48 47 TMatrix<T>::TMatrix(const TMatrix<T>& a,bool share) 49 48 // Constructeur par copie. 50 : mNr(a.mNr), mNc(a.mNc) 51 , mNDBlock(new NDataBlock<T>(*(a.DataBlock()),share)) 49 : mNr(a.mNr), mNc(a.mNc), mNDBlock(a.mNDBlock,share) 52 50 { 53 51 } … … 57 55 // Destructeur 58 56 { 59 Delete();60 }61 62 template <class T>63 void TMatrix<T>::Delete(void)64 // Pour desallouer65 {66 mNr = mNc = 0;67 if(mNDBlock) delete mNDBlock; mNDBlock = NULL;68 57 } 69 58 … … 71 60 template <class T> 72 61 void TMatrix<T>::Clone(const TMatrix<T>& a) 73 // Clone (copie de donnee) a partir de "a" 74 { 75 if(a.mNr==0 || a.mNc==0 || a.DataBlock()==NULL) {Delete(); return;} 76 if(mNDBlock) Delete(); 77 else NDataBlock<T>* mNDBlock = new NDataBlock<T>(1); // cas "a" vide 78 mNr = a.mNr; mNc = a.mNc; 79 mNDBlock->Clone(*(a.DataBlock())); 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; 80 66 } 81 67 … … 84 70 // Reset de la matrice a "v" 85 71 { 86 if(mNDBlock==NULL) 87 throw(NullPtrError("TMatrix::Reset mNDBlock==NULL\n")); 88 if(mNr==0 || mNc==0) 89 throw(SzMismatchError("TMatrix::Reset mNr==0 || mNc==0\n")); 90 mNDBlock->Reset(v); 72 mNDBlock.Reset(v); 91 73 } 92 74 … … 96 78 { 97 79 if(r==0 || c==0) throw(SzMismatchError("TMatrix::ReSize r ou c==0\n")); 98 if(mNDBlock==NULL) NDataBlock<T>* mNDBlock = new NDataBlock<T>(1);99 80 if(!force_alloc && mNr==r && mNc==c) return; 100 mNr = r; mNc = c; 101 mNDBlock->ReSize(r*c); 81 mNr = r; mNc = c; mNDBlock.ReSize(r*c,force_alloc); 102 82 } 103 83 … … 109 89 // Operateur d'affectation depuis scalaire : identite * scalaire. 110 90 { 111 if(mNr!=mNc || mNr==0 || mNDBlock==NULL) 112 throw(SzMismatchError("TMatrix::operator= mNc!=mNr ou ==0 ou mNDBlock==NULL\n")); 113 for(int r=0;r<mNr;r++) for(int c=0;c<mNc;c++) (*this)(r,c) = (r==c)? x: 0; 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; 114 95 return *this; 115 96 } … … 117 98 template <class T> 118 99 TMatrix<T>& TMatrix<T>::operator = (const TMatrix<T>& a) 119 // Operateur d'affectation A=B (sans reaffectation) 100 // Operateur d'affectation A=a 101 // (Re)allocation de la place memoire 102 // sauf si "a" est cree temporairement (partage) 120 103 { 121 104 if(this == &a) return *this; 122 if(mNr!=a.mNc || mNc!=a.mNc || mNr==0 || mNc==0) 123 throw(SzMismatchError("TMatrix::operator= mNc!=a.mNc ou mNr!=a.mNr ou ==0\n")); 124 if(mNDBlock==NULL) 125 throw(SzMismatchError("TMatrix::operator= mNDBlock==NULL\n")); 126 *(mNDBlock) = *(a.DataBlock()); 105 Clone(a); 127 106 return *this; 128 107 } … … 138 117 os<<"TMatrix::Print("<<mNr<<","<<mNc<<")"<<endl; 139 118 if(lp>0) 140 {os<<" this="<<this<<" mNDBlock="<<mNDBlock<<endl; 141 if(mNDBlock) mNDBlock->Print(0,0);} 119 {os<<" this="<<this<<endl; mNDBlock.Print(0,0);} 142 120 if(mNr==0 || mNc==0) return; 143 121 if(i0>=mNr || j0>=mNc || ni==0 || nj==0) return; 144 122 uint_4 i1 = i0+ni; if(i1>mNr) i1 = mNr; 145 123 uint_4 j1 = j0+nj; if(j1>mNc) j1 = mNc; 146 for(int i=i0;i<i1;i++) { 147 for(int j=j0;j<j1;j++) cout<<" "<<(*this)(i,j)<<endl; 124 for(uint_4 i=i0;i<i1;i++) { 125 for(uint_4 j=j0;j<j1;j++) cout<<" "<<(*this)(i,j); 126 cout<<endl; 148 127 } 149 128 } … … 155 134 TMatrix<T>& TMatrix<T>::operator += (T b) 156 135 { 157 if(mNr==0 || mNc==0 || !mNDBlock) 158 throw(SzMismatchError("TMatrix::operator+=v mNr==0 || mNc==0 || !mNDBlock\n")); 159 *mNDBlock += b; 136 mNDBlock += b; 160 137 return *this; 161 138 } … … 164 141 TMatrix<T>& TMatrix<T>::operator -= (T b) 165 142 { 166 if(mNr==0 || mNc==0 || !mNDBlock) 167 throw(SzMismatchError("TMatrix::operator-=v mNr==0 || mNc==0 || !mNDBlock\n")); 168 *mNDBlock -= b; 143 mNDBlock -= b; 169 144 return *this; 170 145 } … … 173 148 TMatrix<T>& TMatrix<T>::operator *= (T b) 174 149 { 175 if(mNr==0 || mNc==0 || !mNDBlock) 176 throw(SzMismatchError("TMatrix::operator*=v mNr==0 || mNc==0 || !mNDBlock\n")); 177 *mNDBlock *= b; 150 mNDBlock *= b; 178 151 return *this; 179 152 } … … 182 155 TMatrix<T>& TMatrix<T>::operator /= (T b) 183 156 { 184 if(b==(T) 0) throw(ParmError("TMatrix::operator/=v divide by zero\n")); 185 if(mNr==0 || mNc==0 || !mNDBlock) 186 throw(SzMismatchError("TMatrix::operator/=v mNr==0 || mNc==0 || !mNDBlock\n")); 187 *mNDBlock /= b; 157 mNDBlock /= b; 188 158 return *this; 189 159 } … … 195 165 TMatrix<T>& TMatrix<T>::operator += (const TMatrix<T>& a) 196 166 { 197 if(mNr==0 || mNc==0 || mNr!=a.mNr || mNc!=a.mNc || !mNDBlock || !a.mNDBlock)198 throw(SzMismatchError("TMatrix::operator+=A size mismatch /null"));199 *(mNDBlock) += *(a.mNDBlock);167 if(mNr==0 || mNc==0 || mNr!=a.mNr || mNc!=a.mNc) 168 throw(SzMismatchError("TMatrix::operator+=A size mismatch")); 169 mNDBlock += a.mNDBlock; 200 170 return *this; 201 171 } … … 204 174 TMatrix<T>& TMatrix<T>::operator -= (const TMatrix<T>& a) 205 175 { 206 if(mNr==0 || mNc==0 || mNr!=a.mNr || mNc!=a.mNc || !mNDBlock || !a.mNDBlock)207 throw(SzMismatchError("TMatrix::operator-=A size mismatch /null"));208 *(mNDBlock) -= *(a.mNDBlock);176 if(mNr==0 || mNc==0 || mNr!=a.mNr || mNc!=a.mNc) 177 throw(SzMismatchError("TMatrix::operator-=A size mismatch")); 178 mNDBlock -= a.mNDBlock; 209 179 return *this; 210 180 } … … 215 185 { 216 186 uint_4 ndata = mNr*mNc; 217 if(ndata==0 || mNc!=a.mNr || a.mNr!=a.mNc || !mNDBlock || !a.mNDBlock)218 throw(SzMismatchError("TMatrix::operator*=A size mismatch /null"));187 if(ndata==0 || mNc!=a.mNr || a.mNr!=a.mNc) 188 throw(SzMismatchError("TMatrix::operator*=A size mismatch")); 219 189 // A(i,j) = Sum(k) A(i,k)*B(k,j) ... il faut sauver la ligne "i" de A 220 190 // Vecteur oi : vecteur ou est sauve la ligne i de la matrice *this … … 238 208 } 239 209 210 //////////////////////////////////////////////////////////////// 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 216 { 217 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 } 227 return result; 228 } 229 230 template <class T> 231 TMatrix<T> TMatrix<T>::Sub(const TMatrix<T>& b) const 232 // C = A(this)-B 233 { 234 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 } 244 return result; 245 } 246 247 template <class T> 248 TMatrix<T> TMatrix<T>::Mul(const TMatrix<T>& b) const 249 // C = A(this)*B : Cij = Aik Bkj (allocation forcee dans tous les cas) 250 { 251 if(mNr==0 || mNc==0 || b.mNc==0 || mNc!=b.mNr) 252 throw(SzMismatchError("NDataBlock operator C=A*B size mismatch\n")); 253 TMatrix<T> r; r.SetTemp(true); r.Realloc(mNr,b.mNc,true); 254 T *ai,*aik,*bj,*bkj,*ri,*rij; 255 for(ri=const_cast<T *>(r.Data()),ai=const_cast<T *>(Data()); 256 ri<r.Data()+r.mNr*r.mNc;ri+=r.mNc,ai+=mNc) { 257 for(rij=ri,bj=const_cast<T *>(b.Data());rij<ri+r.mNc;rij++,bj++) { 258 *rij = 0; 259 for(aik=ai,bkj=bj;aik<ai+mNc;aik++,bkj+=b.mNc) *rij += *aik * *bkj; 260 } 261 } 262 return r; 263 } 264 265 //////////////////////////////////////////////////////////////// 266 // ------------------------------------------------------------------------- 267 // Les objets delegues pour la gestion de persistance 268 // ------------------------------------------------------------------------- 269 270 template <class T> 271 FIO_TMatrix<T>::FIO_TMatrix() 272 { 273 dobj=new TMatrix<T>; 274 ownobj=true; 275 } 276 277 template <class T> 278 FIO_TMatrix<T>::FIO_TMatrix(string const & filename) 279 { 280 dobj=new TMatrix<T>; 281 ownobj=true; 282 Read(filename); 283 } 284 285 template <class T> 286 FIO_TMatrix<T>::FIO_TMatrix(const TMatrix<T> & obj) 287 { 288 dobj = new TMatrix<T>(obj); 289 ownobj=true; 290 } 291 292 template <class T> 293 FIO_TMatrix<T>::FIO_TMatrix(TMatrix<T> * obj) 294 { 295 dobj = obj; 296 ownobj=false; 297 } 298 299 template <class T> 300 FIO_TMatrix<T>::~FIO_TMatrix() 301 { 302 if (ownobj && dobj) delete dobj; 303 } 304 305 template <class T> 306 AnyDataObj* FIO_TMatrix<T>::DataObj() 307 { 308 return(dobj); 309 } 310 311 312 template <class T> 313 void FIO_TMatrix<T>::ReadSelf(PInPersist& is) 314 { 315 // On lit les 3 premiers uint_8 316 uint_4 itab[2]; 317 is.Get(itab,2); 318 if (dobj == NULL) dobj = new TMatrix<T>(itab[0],itab[1]); 319 else dobj->Realloc(itab[0],itab[1],false); 320 // On lit le NDataBlock 321 //cmv encore des problemes avec les consteries 322 //FIO_NDataBlock<T> fio_nd(&dobj->DataBlock()); 323 //fio_nd.ReadSelf(is); 324 } 325 326 template <class T> 327 void FIO_TMatrix<T>::WriteSelf(POutPersist& os) const 328 { 329 if (dobj == NULL) return; 330 // On ecrit 2 uint_4 .... 0 : NRows, 1 : NCol 331 uint_4 itab[2]; 332 itab[0] = dobj->NRows(); 333 itab[1] = dobj->NCol(); 334 os.Put(itab,2); 335 // On ecrit le NDataBlock 336 //cmv encore des problemes avec les consteries 337 //FIO_NDataBlock<T> fio_nd(&dobj->DataBlock()); 338 //fio_nd.WriteSelf(os); 339 } 340 240 341 /////////////////////////////////////////////////////////////// 241 342 #ifdef __CXX_PRAGMA_TEMPLATES__ 242 /*243 343 #pragma define_template TMatrix<uint_1> 244 344 #pragma define_template TMatrix<uint_2> … … 249 349 #pragma define_template TMatrix<uint_8> 250 350 #pragma define_template TMatrix<r_4> 251 */252 351 #pragma define_template TMatrix<r_8> 253 /* 254 #pragma define_template TMatrix< complex<float> > 255 #pragma define_template TMatrix< complex<double> > 256 */ 352 #pragma define_template TMatrix< complex<float> > 353 #pragma define_template TMatrix< complex<double> > 257 354 // Instances des delegues FileIO (PPersist) 355 #pragma define_template FIO_TMatrix<uint_1> 356 #pragma define_template FIO_TMatrix<uint_2> 357 #pragma define_template FIO_TMatrix<int_2> 358 #pragma define_template FIO_TMatrix<int_4> 359 #pragma define_template FIO_TMatrix<int_8> 360 #pragma define_template FIO_TMatrix<uint_4> 361 #pragma define_template FIO_TMatrix<uint_8> 362 #pragma define_template FIO_TMatrix<r_8> 363 #pragma define_template FIO_TMatrix<r_4> 364 #pragma define_template FIO_TMatrix< complex<float> > 365 #pragma define_template FIO_TMatrix< complex<double> > 258 366 #endif 259 260 367 261 368 #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES) … … 272 379 template class TMatrix< complex<double> >; 273 380 // Instances des delegues FileIO (PPersist) 381 template class FIO_TMatrix<uint_1>; 382 template class FIO_TMatrix<uint_2>; 383 template class FIO_TMatrix<int_2>; 384 template class FIO_TMatrix<int_4>; 385 template class FIO_TMatrix<int_8>; 386 template class FIO_TMatrix<uint_4>; 387 template class FIO_TMatrix<uint_8>; 388 template class FIO_TMatrix<r_8>; 389 template class FIO_TMatrix<r_4>; 390 template class FIO_TMatrix< complex<float> >; 391 template class FIO_TMatrix< complex<double> >; 274 392 #endif -
trunk/SophyaLib/NTools/tmatrix.h
r279 r286 24 24 virtual ~TMatrix(); 25 25 26 // Temporaire? 27 inline bool IsTemp(void) const {return mNDBlock.IsTemp();} 28 inline void SetTemp(bool temp=false) const 29 {mNDBlock.SetTemp(temp);} 30 26 31 // Gestion taille/Remplissage 27 32 void Clone(const TMatrix<T>& a); … … 33 38 inline int NCol() const {return mNc;} 34 39 T const& operator()(uint_4 r,uint_4 c) const 35 {return *(mNDBlock ->Begin()+r*mNc+c);}40 {return *(mNDBlock.Begin()+r*mNc+c);} 36 41 T& operator()(uint_4 r,uint_4 c) 37 {return *(mNDBlock ->Begin()+r*mNc+c);}38 inline T* Data() {return mNDBlock ->Begin();}39 inline const T* Data() const {return mNDBlock ->Begin();}40 inline NDataBlock<T> *DataBlock() {return mNDBlock;}41 inline const NDataBlock<T> *DataBlock() const {return mNDBlock;}42 {return *(mNDBlock.Begin()+r*mNc+c);} 43 inline T* Data() {return mNDBlock.Begin();} 44 inline const T* Data() const {return mNDBlock.Begin();} 45 inline NDataBlock<T>& DataBlock() {return mNDBlock;} 46 inline const NDataBlock<T>& DataBlock() const {return mNDBlock;} 42 47 43 48 // Operateur d'affectation … … 50 55 {Print(cout,lp,i0,ni,j0,nj);} 51 56 52 // Surcharge d'operateurs 57 // Surcharge d'operateurs INPLACE 53 58 TMatrix<T>& operator += (T b); 54 59 TMatrix<T>& operator -= (T b); … … 60 65 TMatrix<T>& operator *= (const TMatrix<T>& a); 61 66 67 // Pour surcharge d'operateurs 68 TMatrix<T> Add(const TMatrix<T>& b) const; 69 TMatrix<T> Sub(const TMatrix<T>& b) const; 70 TMatrix<T> Mul(const TMatrix<T>& b) const; 71 62 72 protected: 63 void Delete(void);64 65 73 uint_4 mNr,mNc; 66 NDataBlock<T> *mNDBlock;74 NDataBlock<T> mNDBlock; 67 75 }; 68 76 77 ///////////////////////////////////////////////////////////////////////// 69 78 template<class T> 70 79 inline ostream& operator << (ostream& os, const TMatrix<T>& a) 71 80 {a.Print(os); return(os);} 72 81 82 ///////////////////////////////////////////////////////////////////////// 83 template<class T> 84 inline TMatrix<T> operator + (const TMatrix<T>& a, double b) { 85 TMatrix<T> result(a,false); result.DataBlock().SetTemp(true); 86 result += b; 87 return result; 88 } 89 90 template<class T> 91 inline TMatrix<T> operator + (double b,const TMatrix<T>& a) { 92 TMatrix<T> result(a,false); result.DataBlock().SetTemp(true); 93 result += b; 94 return result; 95 } 96 97 template<class T> 98 inline TMatrix<T> operator - (const TMatrix<T>& a, double b) { 99 TMatrix<T> result(a,false); result.DataBlock().SetTemp(true); 100 result -= b; 101 return result; 102 } 103 104 template<class T> 105 inline TMatrix<T> operator - (double b,const TMatrix<T>& a) { 106 TMatrix<T> result(a,false); result.DataBlock().SetTemp(true); 107 result.DataBlock() = b - result.DataBlock(); 108 return result; 109 } 110 111 template<class T> 112 inline TMatrix<T> operator * (const TMatrix<T>& a, double b) { 113 TMatrix<T> result(a,false); result.DataBlock().SetTemp(true); 114 result *= b; 115 return result; 116 } 117 118 template<class T> 119 inline TMatrix<T> operator * (double b,const TMatrix<T>& a) { 120 TMatrix<T> result(a,false); result.DataBlock().SetTemp(true); 121 result *= b; 122 return result; 123 } 124 125 template<class T> 126 inline TMatrix<T> operator / (const TMatrix<T>& a, double b) { 127 TMatrix<T> result(a,false); result.DataBlock().SetTemp(true); 128 result /= b; 129 return result; 130 } 131 132 ///////////////////////////////////////////////////////////////////////// 133 template<class T> 134 inline TMatrix<T> operator + (const TMatrix<T>& a,const TMatrix<T>& b) 135 {return a.Add(b);} 136 137 template<class T> 138 inline TMatrix<T> operator - (const TMatrix<T>& a,const TMatrix<T>& b) 139 {return a.Sub(b);} 140 141 template<class T> 142 inline TMatrix<T> operator * (const TMatrix<T>& a,const TMatrix<T>& b) 143 {return a.Mul(b);} 144 145 ///////////////////////////////////////////////////////////////////////// 146 // Classe pour la gestion de persistance 147 template <class T> 148 class FIO_TMatrix : public PPersist { 149 150 public: 151 FIO_TMatrix(); 152 FIO_TMatrix(string const & filename); 153 FIO_TMatrix(const TMatrix<T> & obj); 154 FIO_TMatrix(TMatrix<T> * obj); 155 virtual ~FIO_TMatrix(); 156 157 virtual AnyDataObj* DataObj(); 158 inline operator TMatrix<T>() { return(*dobj); } 159 160 protected : 161 virtual void ReadSelf(PInPersist&); 162 virtual void WriteSelf(POutPersist&) const; 163 TMatrix<T> * dobj; 164 bool ownobj; 165 }; 166 73 167 } // Fin du namespace 74 168
Note:
See TracChangeset
for help on using the changeset viewer.