source: Sophya/trunk/SophyaLib/NTools/tmatrix.cc@ 286

Last change on this file since 286 was 286, checked in by ansari, 26 years ago

tmatrix suite et fin cmv 30/4/99

File size: 10.4 KB
RevLine 
[286]1// $Id: tmatrix.cc,v 1.2 1999-04-30 11:02:52 ansari Exp $
[279]2// C.Magneville 04/99
3#include "machdefs.h"
4#include <stdio.h>
5#include <stdlib.h>
6#include <iostream.h>
7#include <complex>
8#include "pexceptions.h"
9#include "tmatrix.h"
10#include "objfio.h"
11
12using namespace PlanckDPC;
13
14////////////////////////////////////////////////////////////////
15//************ Createur, Destructeur, gestion des donnees
16
17template <class T>
18TMatrix<T>::TMatrix()
19// Constructeur par defaut.
[286]20: mNr(0), mNc(0), mNDBlock()
[279]21{
22}
23
24template <class T>
25TMatrix<T>::TMatrix(uint_4 r,uint_4 c)
26// Construit une matrice de r lignes et c colonnes.
[286]27: mNr(r), mNc(c), mNDBlock(r*c)
[279]28{
29}
30
31template <class T>
32TMatrix<T>::TMatrix(uint_4 r,uint_4 c,T* values,Bridge* br)
33// Construit une matrice de r lignes et c colonnes. On fournit
34// le tableau des valeurs et eventuellement un Bridge.
[286]35: mNr(r), mNc(c), mNDBlock(r*c,values,br)
[279]36{
37}
38
39template <class T>
40TMatrix<T>::TMatrix(const TMatrix<T>& a)
[286]41// Constructeur par copie (partage des donnees).
42: mNr(a.mNr), mNc(a.mNc), mNDBlock(a.mNDBlock)
[279]43{
44}
45
46template <class T>
47TMatrix<T>::TMatrix(const TMatrix<T>& a,bool share)
48// Constructeur par copie.
[286]49: mNr(a.mNr), mNc(a.mNc), mNDBlock(a.mNDBlock,share)
[279]50{
51}
52
53template <class T>
54TMatrix<T>::~TMatrix()
55// Destructeur
56{
57}
58
59////////////////////////////////////////////////////////////////
60template <class T>
61void TMatrix<T>::Clone(const TMatrix<T>& a)
[286]62// Clone (copie de donnees) a partir de "a"
63// Partage des donnees si "a" est temporaire.
[279]64{
[286]65mNDBlock.Clone(a.mNDBlock); mNr = a.mNr; mNc = a.mNc;
[279]66}
67
68template <class T>
69void TMatrix<T>::Reset(T v)
70// Reset de la matrice a "v"
71{
[286]72mNDBlock.Reset(v);
[279]73}
74
75template <class T>
76void TMatrix<T>::Realloc(uint_4 r,uint_4 c,bool force_alloc)
77// Reallocation de place
78{
79if(r==0 || c==0) throw(SzMismatchError("TMatrix::ReSize r ou c==0\n"));
80if(!force_alloc && mNr==r && mNc==c) return;
[286]81mNr = r; mNc = c; mNDBlock.ReSize(r*c,force_alloc);
[279]82}
83
84////////////////////////////////////////////////////////////////
85//**** Surcharge de TMatrix=TMatrix; TMatrix=<T> b;
86
87template <class T>
88TMatrix<T>& TMatrix<T>::operator = (T x)
89// Operateur d'affectation depuis scalaire : identite * scalaire.
90{
[286]91if(mNr!=mNc || mNr==0)
92 throw(SzMismatchError("TMatrix::operator= mNc!=mNr ou ==0\n"));
93for(uint_4 r=0;r<mNr;r++) for(uint_4 c=0;c<mNc;c++)
94 (*this)(r,c) = (r==c)? x: 0;
[279]95return *this;
96}
97
98template <class T>
99TMatrix<T>& TMatrix<T>::operator = (const TMatrix<T>& a)
[286]100// Operateur d'affectation A=a
101// (Re)allocation de la place memoire
102// sauf si "a" est cree temporairement (partage)
[279]103{
104if(this == &a) return *this;
[286]105Clone(a);
[279]106return *this;
107}
108
109////////////////////////////////////////////////////////////////
110//**** Impression
111
112template <class T>
113void TMatrix<T>::Print(ostream& os,int lp
114 ,uint_4 i0,uint_4 ni,uint_4 j0,uint_4 nj) const
115// Impression de la sous-matrice (i:i+ni-1,i:j+nj-1)
116{
117 os<<"TMatrix::Print("<<mNr<<","<<mNc<<")"<<endl;
118if(lp>0)
[286]119 {os<<" this="<<this<<endl; mNDBlock.Print(0,0);}
[279]120if(mNr==0 || mNc==0) return;
121if(i0>=mNr || j0>=mNc || ni==0 || nj==0) return;
122uint_4 i1 = i0+ni; if(i1>mNr) i1 = mNr;
123uint_4 j1 = j0+nj; if(j1>mNc) j1 = mNc;
[286]124for(uint_4 i=i0;i<i1;i++) {
125 for(uint_4 j=j0;j<j1;j++) cout<<" "<<(*this)(i,j);
126 cout<<endl;
[279]127}
128}
129
130////////////////////////////////////////////////////////////////
131//**** Surcharge de +=,-=,*=,/= (INPLACE): TMatrix += <T> b;
132
133template <class T>
134TMatrix<T>& TMatrix<T>::operator += (T b)
135{
[286]136mNDBlock += b;
[279]137return *this;
138}
139
140template <class T>
141TMatrix<T>& TMatrix<T>::operator -= (T b)
142{
[286]143mNDBlock -= b;
[279]144return *this;
145}
146
147template <class T>
148TMatrix<T>& TMatrix<T>::operator *= (T b)
149{
[286]150mNDBlock *= b;
[279]151return *this;
152}
153
154template <class T>
155TMatrix<T>& TMatrix<T>::operator /= (T b)
156{
[286]157mNDBlock /= b;
[279]158return *this;
159}
160
161////////////////////////////////////////////////////////////////
162//**** Surcharge de +=,-=,*= (INPLACE): TMatrix += TMatrix;
163
164template <class T>
165TMatrix<T>& TMatrix<T>::operator += (const TMatrix<T>& a)
166{
[286]167if(mNr==0 || mNc==0 || mNr!=a.mNr || mNc!=a.mNc)
168 throw(SzMismatchError("TMatrix::operator+=A size mismatch"));
169mNDBlock += a.mNDBlock;
[279]170return *this;
171}
172
173template <class T>
174TMatrix<T>& TMatrix<T>::operator -= (const TMatrix<T>& a)
175{
[286]176if(mNr==0 || mNc==0 || mNr!=a.mNr || mNc!=a.mNc)
177 throw(SzMismatchError("TMatrix::operator-=A size mismatch"));
178mNDBlock -= a.mNDBlock;
[279]179return *this;
180}
181
182template <class T>
183TMatrix<T>& TMatrix<T>::operator *= (const TMatrix<T>& a)
184// A = A*B -> A(n,m) = A(n,m)*B(m,m)
185{
186uint_4 ndata = mNr*mNc;
[286]187if(ndata==0 || mNc!=a.mNr || a.mNr!=a.mNc)
188 throw(SzMismatchError("TMatrix::operator*=A size mismatch"));
[279]189// A(i,j) = Sum(k) A(i,k)*B(k,j) ... il faut sauver la ligne "i" de A
190// Vecteur oi : vecteur ou est sauve la ligne i de la matrice *this
191// oi,oe = pointeur de debut et de fin du vecteur temporaire
192// oij = pointeur parcourant le vecteur oi
193// Matrice *this: i = pointeur du debut de la ligne i
194// ij = pointeur parcourant la ligne i
195// Matrice a : aj = pointeur de debut de la colonne j
196// aji = pointeur parcourant la colonne j
197T* oi = new T[mNc]; T* oe = oi+mNc;
198for(T *i=Data(); i<Data()+ndata; i+=mNc) {
199 {for(T *oij=oi,*ij=i; oij<oe;) *oij++ = *ij++;}
200 {for(T *ij=i,*aj=const_cast<T *>(a.Data()); aj<a.Data()+a.mNc; ij++,aj++) {
201 T sum = 0;
202 for(T *oij=oi,*aji=aj; oij<oe; oij++,aji+=a.mNc) sum += *oij * *aji;
203 *ij = sum;
204 }}
205}
206delete [] oi;
207return *this;
208}
209
[286]210////////////////////////////////////////////////////////////////
211//**** Surcharge de +,-,*: TMatrix = TMatrix + TMatrix;
212
213template <class T>
214TMatrix<T> TMatrix<T>::Add(const TMatrix<T>& b) const
215// C = A(this)+B
216{
217if(mNr!=b.mNr || mNc!=b.mNc)
218 throw(SzMismatchError("NDataBlock operator C=A+B size mismatch\n"));
219TMatrix<T> result; result.SetTemp(true);
220if(b.IsTemp()) {
221 result.Clone(b);
222 result += *this;
223} else {
224 result.Clone(*this);
225 result += b;
226}
227return result;
228}
229
230template <class T>
231TMatrix<T> TMatrix<T>::Sub(const TMatrix<T>& b) const
232// C = A(this)-B
233{
234if(mNr!=b.mNr || mNc!=b.mNc)
235 throw(SzMismatchError("NDataBlock operator C=A-B size mismatch\n"));
236TMatrix<T> result; result.SetTemp(true);
237if(b.IsTemp()) {
238 result.Clone(b);
239 result.mNDBlock = (*this).mNDBlock - result.mNDBlock;
240} else {
241 result.Clone(*this);
242 result -= b;
243}
244return result;
245}
246
247template <class T>
248TMatrix<T> TMatrix<T>::Mul(const TMatrix<T>& b) const
249// C = A(this)*B : Cij = Aik Bkj (allocation forcee dans tous les cas)
250{
251if(mNr==0 || mNc==0 || b.mNc==0 || mNc!=b.mNr)
252 throw(SzMismatchError("NDataBlock operator C=A*B size mismatch\n"));
253TMatrix<T> r; r.SetTemp(true); r.Realloc(mNr,b.mNc,true);
254T *ai,*aik,*bj,*bkj,*ri,*rij;
255for(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}
262return r;
263}
264
265////////////////////////////////////////////////////////////////
266// -------------------------------------------------------------------------
267// Les objets delegues pour la gestion de persistance
268// -------------------------------------------------------------------------
269
270template <class T>
271FIO_TMatrix<T>::FIO_TMatrix()
272{
273dobj=new TMatrix<T>;
274ownobj=true;
275}
276
277template <class T>
278FIO_TMatrix<T>::FIO_TMatrix(string const & filename)
279{
280dobj=new TMatrix<T>;
281ownobj=true;
282Read(filename);
283}
284
285template <class T>
286FIO_TMatrix<T>::FIO_TMatrix(const TMatrix<T> & obj)
287{
288dobj = new TMatrix<T>(obj);
289ownobj=true;
290}
291
292template <class T>
293FIO_TMatrix<T>::FIO_TMatrix(TMatrix<T> * obj)
294{
295dobj = obj;
296ownobj=false;
297}
298
299template <class T>
300FIO_TMatrix<T>::~FIO_TMatrix()
301{
302if (ownobj && dobj) delete dobj;
303}
304
305template <class T>
306AnyDataObj* FIO_TMatrix<T>::DataObj()
307{
308return(dobj);
309}
310
311
312template <class T>
313void FIO_TMatrix<T>::ReadSelf(PInPersist& is)
314{
315// On lit les 3 premiers uint_8
316uint_4 itab[2];
317is.Get(itab,2);
318if (dobj == NULL) dobj = new TMatrix<T>(itab[0],itab[1]);
319else 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
326template <class T>
327void FIO_TMatrix<T>::WriteSelf(POutPersist& os) const
328{
329if (dobj == NULL) return;
330// On ecrit 2 uint_4 .... 0 : NRows, 1 : NCol
331uint_4 itab[2];
332itab[0] = dobj->NRows();
333itab[1] = dobj->NCol();
334os.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
[279]341///////////////////////////////////////////////////////////////
342#ifdef __CXX_PRAGMA_TEMPLATES__
343#pragma define_template TMatrix<uint_1>
344#pragma define_template TMatrix<uint_2>
345#pragma define_template TMatrix<int_2>
346#pragma define_template TMatrix<int_4>
347#pragma define_template TMatrix<int_8>
348#pragma define_template TMatrix<uint_4>
349#pragma define_template TMatrix<uint_8>
350#pragma define_template TMatrix<r_4>
351#pragma define_template TMatrix<r_8>
[286]352#pragma define_template TMatrix< complex<float> >
353#pragma define_template TMatrix< complex<double> >
[279]354// Instances des delegues FileIO (PPersist)
[286]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> >
[279]366#endif
367
368#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
369template class TMatrix<uint_1>;
370template class TMatrix<uint_2>;
371template class TMatrix<int_2>;
372template class TMatrix<int_4>;
373template class TMatrix<int_8>;
374template class TMatrix<uint_4>;
375template class TMatrix<uint_8>;
376template class TMatrix<r_4>;
377template class TMatrix<r_8>;
378template class TMatrix< complex<float> >;
379template class TMatrix< complex<double> >;
380// Instances des delegues FileIO (PPersist)
[286]381template class FIO_TMatrix<uint_1>;
382template class FIO_TMatrix<uint_2>;
383template class FIO_TMatrix<int_2>;
384template class FIO_TMatrix<int_4>;
385template class FIO_TMatrix<int_8>;
386template class FIO_TMatrix<uint_4>;
387template class FIO_TMatrix<uint_8>;
388template class FIO_TMatrix<r_8>;
389template class FIO_TMatrix<r_4>;
390template class FIO_TMatrix< complex<float> >;
391template class FIO_TMatrix< complex<double> >;
[279]392#endif
Note: See TracBrowser for help on using the repository browser.