// $Id: tmatrix.cc,v 1.2 1999-04-30 11:02:52 ansari Exp $ // C.Magneville 04/99 #include "machdefs.h" #include #include #include #include #include "pexceptions.h" #include "tmatrix.h" #include "objfio.h" using namespace PlanckDPC; //////////////////////////////////////////////////////////////// //************ Createur, Destructeur, gestion des donnees template TMatrix::TMatrix() // Constructeur par defaut. : mNr(0), mNc(0), mNDBlock() { } template TMatrix::TMatrix(uint_4 r,uint_4 c) // Construit une matrice de r lignes et c colonnes. : mNr(r), mNc(c), mNDBlock(r*c) { } template TMatrix::TMatrix(uint_4 r,uint_4 c,T* values,Bridge* br) // Construit une matrice de r lignes et c colonnes. On fournit // le tableau des valeurs et eventuellement un Bridge. : mNr(r), mNc(c), mNDBlock(r*c,values,br) { } template TMatrix::TMatrix(const TMatrix& a) // Constructeur par copie (partage des donnees). : mNr(a.mNr), mNc(a.mNc), mNDBlock(a.mNDBlock) { } template TMatrix::TMatrix(const TMatrix& a,bool share) // Constructeur par copie. : mNr(a.mNr), mNc(a.mNc), mNDBlock(a.mNDBlock,share) { } template TMatrix::~TMatrix() // Destructeur { } //////////////////////////////////////////////////////////////// template void TMatrix::Clone(const TMatrix& a) // Clone (copie de donnees) a partir de "a" // Partage des donnees si "a" est temporaire. { mNDBlock.Clone(a.mNDBlock); mNr = a.mNr; mNc = a.mNc; } template void TMatrix::Reset(T v) // Reset de la matrice a "v" { mNDBlock.Reset(v); } template void TMatrix::Realloc(uint_4 r,uint_4 c,bool force_alloc) // Reallocation de place { if(r==0 || c==0) throw(SzMismatchError("TMatrix::ReSize r ou c==0\n")); if(!force_alloc && mNr==r && mNc==c) return; mNr = r; mNc = c; mNDBlock.ReSize(r*c,force_alloc); } //////////////////////////////////////////////////////////////// //**** Surcharge de TMatrix=TMatrix; TMatrix= b; template TMatrix& TMatrix::operator = (T x) // Operateur d'affectation depuis scalaire : identite * scalaire. { if(mNr!=mNc || mNr==0) throw(SzMismatchError("TMatrix::operator= mNc!=mNr ou ==0\n")); for(uint_4 r=0;r TMatrix& TMatrix::operator = (const TMatrix& a) // Operateur d'affectation A=a // (Re)allocation de la place memoire // sauf si "a" est cree temporairement (partage) { if(this == &a) return *this; Clone(a); return *this; } //////////////////////////////////////////////////////////////// //**** Impression template void TMatrix::Print(ostream& os,int lp ,uint_4 i0,uint_4 ni,uint_4 j0,uint_4 nj) const // Impression de la sous-matrice (i:i+ni-1,i:j+nj-1) { os<<"TMatrix::Print("<0) {os<<" this="<=mNr || j0>=mNc || ni==0 || nj==0) return; uint_4 i1 = i0+ni; if(i1>mNr) i1 = mNr; uint_4 j1 = j0+nj; if(j1>mNc) j1 = mNc; for(uint_4 i=i0;i b; template TMatrix& TMatrix::operator += (T b) { mNDBlock += b; return *this; } template TMatrix& TMatrix::operator -= (T b) { mNDBlock -= b; return *this; } template TMatrix& TMatrix::operator *= (T b) { mNDBlock *= b; return *this; } template TMatrix& TMatrix::operator /= (T b) { mNDBlock /= b; return *this; } //////////////////////////////////////////////////////////////// //**** Surcharge de +=,-=,*= (INPLACE): TMatrix += TMatrix; template TMatrix& 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; } template TMatrix& 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; } template TMatrix& TMatrix::operator *= (const TMatrix& a) // A = A*B -> A(n,m) = A(n,m)*B(m,m) { uint_4 ndata = mNr*mNc; if(ndata==0 || mNc!=a.mNr || a.mNr!=a.mNc) throw(SzMismatchError("TMatrix::operator*=A size mismatch")); // A(i,j) = Sum(k) A(i,k)*B(k,j) ... il faut sauver la ligne "i" de A // Vecteur oi : vecteur ou est sauve la ligne i de la matrice *this // oi,oe = pointeur de debut et de fin du vecteur temporaire // oij = pointeur parcourant le vecteur oi // Matrice *this: i = pointeur du debut de la ligne i // ij = pointeur parcourant la ligne i // Matrice a : aj = pointeur de debut de la colonne j // aji = pointeur parcourant la colonne j T* oi = new T[mNc]; T* oe = oi+mNc; for(T *i=Data(); i(a.Data()); aj TMatrix TMatrix::Add(const TMatrix& b) const // C = A(this)+B { if(mNr!=b.mNr || mNc!=b.mNc) throw(SzMismatchError("NDataBlock operator C=A+B size mismatch\n")); TMatrix result; result.SetTemp(true); if(b.IsTemp()) { result.Clone(b); result += *this; } else { result.Clone(*this); result += b; } return result; } template TMatrix TMatrix::Sub(const TMatrix& b) const // C = A(this)-B { if(mNr!=b.mNr || mNc!=b.mNc) throw(SzMismatchError("NDataBlock operator C=A-B size mismatch\n")); TMatrix result; result.SetTemp(true); if(b.IsTemp()) { result.Clone(b); result.mNDBlock = (*this).mNDBlock - result.mNDBlock; } else { result.Clone(*this); result -= b; } return result; } template TMatrix TMatrix::Mul(const TMatrix& b) const // C = A(this)*B : Cij = Aik Bkj (allocation forcee dans tous les cas) { if(mNr==0 || mNc==0 || b.mNc==0 || mNc!=b.mNr) throw(SzMismatchError("NDataBlock operator C=A*B size mismatch\n")); TMatrix r; r.SetTemp(true); r.Realloc(mNr,b.mNc,true); T *ai,*aik,*bj,*bkj,*ri,*rij; for(ri=const_cast(r.Data()),ai=const_cast(Data()); ri(b.Data());rij FIO_TMatrix::FIO_TMatrix() { dobj=new TMatrix; ownobj=true; } template FIO_TMatrix::FIO_TMatrix(string const & filename) { dobj=new TMatrix; ownobj=true; Read(filename); } template FIO_TMatrix::FIO_TMatrix(const TMatrix & obj) { dobj = new TMatrix(obj); ownobj=true; } template FIO_TMatrix::FIO_TMatrix(TMatrix * obj) { dobj = obj; ownobj=false; } template FIO_TMatrix::~FIO_TMatrix() { if (ownobj && dobj) delete dobj; } template AnyDataObj* FIO_TMatrix::DataObj() { return(dobj); } template void FIO_TMatrix::ReadSelf(PInPersist& is) { // On lit les 3 premiers uint_8 uint_4 itab[2]; is.Get(itab,2); if (dobj == NULL) dobj = new TMatrix(itab[0],itab[1]); else dobj->Realloc(itab[0],itab[1],false); // On lit le NDataBlock //cmv encore des problemes avec les consteries //FIO_NDataBlock fio_nd(&dobj->DataBlock()); //fio_nd.ReadSelf(is); } template void FIO_TMatrix::WriteSelf(POutPersist& os) const { if (dobj == NULL) return; // On ecrit 2 uint_4 .... 0 : NRows, 1 : NCol uint_4 itab[2]; itab[0] = dobj->NRows(); itab[1] = dobj->NCol(); os.Put(itab,2); // On ecrit le NDataBlock //cmv encore des problemes avec les consteries //FIO_NDataBlock fio_nd(&dobj->DataBlock()); //fio_nd.WriteSelf(os); } /////////////////////////////////////////////////////////////// #ifdef __CXX_PRAGMA_TEMPLATES__ #pragma define_template TMatrix #pragma define_template TMatrix #pragma define_template TMatrix #pragma define_template TMatrix #pragma define_template TMatrix #pragma define_template TMatrix #pragma define_template TMatrix #pragma define_template TMatrix #pragma define_template TMatrix #pragma define_template TMatrix< complex > #pragma define_template TMatrix< complex > // Instances des delegues FileIO (PPersist) #pragma define_template FIO_TMatrix #pragma define_template FIO_TMatrix #pragma define_template FIO_TMatrix #pragma define_template FIO_TMatrix #pragma define_template FIO_TMatrix #pragma define_template FIO_TMatrix #pragma define_template FIO_TMatrix #pragma define_template FIO_TMatrix #pragma define_template FIO_TMatrix #pragma define_template FIO_TMatrix< complex > #pragma define_template FIO_TMatrix< complex > #endif #if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES) template class TMatrix; template class TMatrix; template class TMatrix; template class TMatrix; template class TMatrix; template class TMatrix; template class TMatrix; template class TMatrix; template class TMatrix; template class TMatrix< complex >; template class TMatrix< complex >; // Instances des delegues FileIO (PPersist) template class FIO_TMatrix; template class FIO_TMatrix; template class FIO_TMatrix; template class FIO_TMatrix; template class FIO_TMatrix; template class FIO_TMatrix; template class FIO_TMatrix; template class FIO_TMatrix; template class FIO_TMatrix; template class FIO_TMatrix< complex >; template class FIO_TMatrix< complex >; #endif