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

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

TMatrixRC<T> + GausPiv interne a TMatrix (sans Matrix)
Resolution pb des friend template (namesapce!)
createur Vector a partir de TVector<r_8> cmv 18/5/99

File size: 19.3 KB
RevLine 
[304]1// $Id: tmatrix.cc,v 1.8 1999-05-18 17:19:36 ansari Exp $
[279]2// C.Magneville 04/99
3#include "machdefs.h"
4#include <stdio.h>
5#include <stdlib.h>
6#include <iostream.h>
[304]7#include <values.h>
[279]8#include <complex>
9#include "pexceptions.h"
10#include "tmatrix.h"
11#include "objfio.h"
12
13using namespace PlanckDPC;
14
15////////////////////////////////////////////////////////////////
[288]16//**** Createur, Destructeur
[279]17
18template <class T>
19TMatrix<T>::TMatrix()
20// Constructeur par defaut.
[286]21: mNr(0), mNc(0), mNDBlock()
[279]22{
23}
24
25template <class T>
26TMatrix<T>::TMatrix(uint_4 r,uint_4 c)
27// Construit une matrice de r lignes et c colonnes.
[286]28: mNr(r), mNc(c), mNDBlock(r*c)
[279]29{
30}
31
32template <class T>
33TMatrix<T>::TMatrix(uint_4 r,uint_4 c,T* values,Bridge* br)
34// Construit une matrice de r lignes et c colonnes. On fournit
35// le tableau des valeurs et eventuellement un Bridge.
[286]36: mNr(r), mNc(c), mNDBlock(r*c,values,br)
[279]37{
38}
39
40template <class T>
41TMatrix<T>::TMatrix(const TMatrix<T>& a)
[288]42// Constructeur par copie (partage si "a" temporaire).
[286]43: mNr(a.mNr), mNc(a.mNc), mNDBlock(a.mNDBlock)
[279]44{
45}
46
47template <class T>
48TMatrix<T>::TMatrix(const TMatrix<T>& a,bool share)
[288]49// Constructeur par copie avec possibilite de forcer le partage ou non.
[286]50: mNr(a.mNr), mNc(a.mNc), mNDBlock(a.mNDBlock,share)
[279]51{
52}
53
54template <class T>
55TMatrix<T>::~TMatrix()
56// Destructeur
57{
58}
59
60////////////////////////////////////////////////////////////////
[288]61// Operations matricielles
[279]62template <class T>
[288]63TMatrix<T> TMatrix<T>::Transpose(void) const
64// Transposition
[279]65{
[288]66TMatrix<T> a; a.Clone(*this); a.SetTemp(true);
67a.mNr = mNc; a.mNc = mNr;
[301]68{for(uint_4 i=0; i<mNr; i++)
69 for(uint_4 j=0; j<mNc; j++) {
[288]70 a(j,i) = (*this)(i,j);
71}}
72return a;
[279]73}
74
75////////////////////////////////////////////////////////////////
76//**** Impression
77
78template <class T>
79void TMatrix<T>::Print(ostream& os,int lp
80 ,uint_4 i0,uint_4 ni,uint_4 j0,uint_4 nj) const
81// Impression de la sous-matrice (i:i+ni-1,i:j+nj-1)
82{
[288]83os<<"TMatrix::Print("<<mNr<<","<<mNc<<")"<<endl;
[279]84if(lp>0)
[286]85 {os<<" this="<<this<<endl; mNDBlock.Print(0,0);}
[279]86if(mNr==0 || mNc==0) return;
87if(i0>=mNr || j0>=mNc || ni==0 || nj==0) return;
88uint_4 i1 = i0+ni; if(i1>mNr) i1 = mNr;
89uint_4 j1 = j0+nj; if(j1>mNc) j1 = mNc;
[286]90for(uint_4 i=i0;i<i1;i++) {
91 for(uint_4 j=j0;j<j1;j++) cout<<" "<<(*this)(i,j);
92 cout<<endl;
[279]93}
94}
95
96////////////////////////////////////////////////////////////////
[288]97//**** Surcharge de *= (INPLACE): TMatrix *= TMatrix;
[279]98
99template <class T>
100TMatrix<T>& TMatrix<T>::operator *= (const TMatrix<T>& a)
101// A = A*B -> A(n,m) = A(n,m)*B(m,m)
102{
103uint_4 ndata = mNr*mNc;
[286]104if(ndata==0 || mNc!=a.mNr || a.mNr!=a.mNc)
105 throw(SzMismatchError("TMatrix::operator*=A size mismatch"));
[279]106// A(i,j) = Sum(k) A(i,k)*B(k,j) ... il faut sauver la ligne "i" de A
107// Vecteur oi : vecteur ou est sauve la ligne i de la matrice *this
108// oi,oe = pointeur de debut et de fin du vecteur temporaire
109// oij = pointeur parcourant le vecteur oi
110// Matrice *this: i = pointeur du debut de la ligne i
111// ij = pointeur parcourant la ligne i
112// Matrice a : aj = pointeur de debut de la colonne j
113// aji = pointeur parcourant la colonne j
114T* oi = new T[mNc]; T* oe = oi+mNc;
115for(T *i=Data(); i<Data()+ndata; i+=mNc) {
116 {for(T *oij=oi,*ij=i; oij<oe;) *oij++ = *ij++;}
117 {for(T *ij=i,*aj=const_cast<T *>(a.Data()); aj<a.Data()+a.mNc; ij++,aj++) {
118 T sum = 0;
119 for(T *oij=oi,*aji=aj; oij<oe; oij++,aji+=a.mNc) sum += *oij * *aji;
120 *ij = sum;
121 }}
122}
123delete [] oi;
124return *this;
125}
126
[286]127////////////////////////////////////////////////////////////////
[288]128//**** Pour surcharge d'operateurs C = A (+,-,*,/) B
[286]129
[288]130template <class T> TMatrix<T> TMatrix<T>::Add(const TMatrix<T>& b) const
[286]131{
132if(mNr!=b.mNr || mNc!=b.mNc)
[299]133 throw(SzMismatchError("TMatrix operator C=A+B size mismatch\n"));
[288]134TMatrix<T> result; result.SetTemp(true); result.mNr=mNr; result.mNc=mNc;
135result.mNDBlock = mNDBlock+b.mNDBlock;
[286]136return result;
137}
138
[288]139template <class T> TMatrix<T> TMatrix<T>::Sub(const TMatrix<T>& b) const
[286]140{
141if(mNr!=b.mNr || mNc!=b.mNc)
[299]142 throw(SzMismatchError("TMatrix operator C=A-B size mismatch\n"));
[288]143TMatrix<T> result; result.SetTemp(true); result.mNr=mNr; result.mNc=mNc;
144result.mNDBlock = mNDBlock-b.mNDBlock;
[286]145return result;
146}
147
[288]148template <class T> TMatrix<T> TMatrix<T>::Mul(const TMatrix<T>& b) const
[286]149// C = A(this)*B : Cij = Aik Bkj (allocation forcee dans tous les cas)
150{
151if(mNr==0 || mNc==0 || b.mNc==0 || mNc!=b.mNr)
[299]152 throw(SzMismatchError("TMatrix operator C=A*B size mismatch\n"));
[288]153TMatrix<T> r; r.SetTemp(true); r.ReSize(mNr,b.mNc);
[286]154T *ai,*aik,*bj,*bkj,*ri,*rij;
155for(ri=const_cast<T *>(r.Data()),ai=const_cast<T *>(Data());
156 ri<r.Data()+r.mNr*r.mNc;ri+=r.mNc,ai+=mNc) {
157 for(rij=ri,bj=const_cast<T *>(b.Data());rij<ri+r.mNc;rij++,bj++) {
158 *rij = 0;
159 for(aik=ai,bkj=bj;aik<ai+mNc;aik++,bkj+=b.mNc) *rij += *aik * *bkj;
160 }
161}
162return r;
163}
164
[304]165////////////////////////////////////////////////////////////////
166//**** Pour gestion des lignes et des colonnes
167
168template <class T> TMatrixRC<T> TMatrix<T>::Row(uint_4 r) const
169{
170TMatrixRC<T> rc((TMatrix<T>&)*this, TmatrixRow, r);
171return rc;
172}
173
174template <class T> TMatrixRC<T> TMatrix<T>::Col(uint_4 c) const
175{
176TMatrixRC<T> rc((TMatrix<T>&)*this, TmatrixCol, c);
177return rc;
178}
179
180template <class T> TMatrixRC<T> TMatrix<T>::Diag() const
181{
182TMatrixRC<T> rc((TMatrix<T>&)*this, TmatrixDiag);
183return rc;
184}
185
[299]186#include "matrix.h"
[286]187////////////////////////////////////////////////////////////////
[299]188//**** Pour inversion
[304]189#ifndef M_LN2
190#define M_LN2 0.69314718055994530942
191#endif
192#ifndef LN_MINDOUBLE
193#define LN_MINDOUBLE (M_LN2 * (DMINEXP - 1))
194#endif
195#ifndef LN_MAXDOUBLE
196#define LN_MAXDOUBLE (M_LN2 * DMAXEXP)
197#endif
198
[302]199r_8 TMatrix<r_8>::GausPiv(TMatrix<r_8>& a, TMatrix<r_8>& b)
200// Pivot de Gauss
201// * Attention: egcs impose que cette fonction soit mise dans le .cc
202// avant ::Inverse() (car Inverse() l'utilise)
[304]203// {Matrix A(a); Matrix B(b); return (r_8) Matrix::GausPiv(A,B);}
[302]204{
[304]205uint_4 n = a.NRows();
206if(n!=b.NRows())
207 throw(SzMismatchError("TMatrix::GausPiv size mismatch\n"));
208// On fait une normalisation un peu brutale...
209double vmin=MAXDOUBLE;
210double vmax=0;
211for(uint_4 iii=0; iii<a.NRows(); iii++)
212 for(uint_4 jjj=0; jjj<a.NCols(); jjj++) {
213 double v = TMatrixRC<r_8>::Abs_Value(a(iii,jjj));
214 if(v>vmax) vmax = v;
215 if(v<vmin && v>0) vmin = v;
[302]216}
[304]217double nrm = sqrt(vmin*vmax);
218if(nrm > 1.e5 || nrm < 1.e-5) {
219 a /= nrm;
220 b /= nrm;
221 //cout << "normalisation matrice " << nrm << endl;
222} else nrm=1;
[302]223
[304]224double det = 1.0;
225if(nrm != 1) {
226 double ld = a.NRows() * log(nrm);
227 if (ld <= LN_MINDOUBLE || ld >= LN_MAXDOUBLE) {
228 // cerr << "Matrix warning, overflow for det" << endl;
229 } else {
230 det = exp(ld);
231 }
232}
233
234TMatrixRC<r_8> pivRowa(a,TmatrixRow);
235TMatrixRC<r_8> pivRowb(b,TmatrixRow);
236
237for(uint_4 k=0; k<n-1; k++) {
238 uint_4 iPiv = a.Col(k).IMaxAbs(k);
239 if(iPiv != k) {
240 TMatrixRC<r_8> aIPiv(a.Row(iPiv));
241 TMatrixRC<r_8> aK(a.Row(k));
242 TMatrixRC<r_8>::Swap(aIPiv,aK);
243 TMatrixRC<r_8> bIPiv(b.Row(iPiv));
244 TMatrixRC<r_8> bK(b.Row(k));
245 TMatrixRC<r_8>::Swap(bIPiv,bK);
246 }
247 double pivot = a(k,k);
248 if (fabs(pivot) < 1.e-50) return 0.0;
249 //det *= pivot;
250 pivRowa.SetRow(k); // to avoid constructors
251 pivRowb.SetRow(k);
252 for (uint_4 i=k+1; i<n; i++) {
253 double r = -a(i,k)/pivot;
254 a.Row(i).LinComb(r, pivRowa); // + rapide que -= r * pivRowa
255 b.Row(i).LinComb(r, pivRowb);
256 }
257}
258det *= a(n-1, n-1);
259
260// on remonte
261for(uint_4 kk=n-1; kk>0; kk--) {
262 double pivot = a(kk,kk);
263 if (fabs(pivot) <= 1.e-50) return 0.0;
264 pivRowa.SetRow(kk); // to avoid constructors
265 pivRowb.SetRow(kk);
266 for(uint_4 jj=0; jj<kk; jj++) {
267 double r = -a(jj,kk)/pivot;
268 a.Row(jj).LinComb(r, pivRowa);
269 b.Row(jj).LinComb(r, pivRowb);
270 }
271}
272
273for(uint_4 l=0; l<n; l++) {
274 if (fabs(a(l,l)) <= 1.e-50) return 0.0;
275 b.Row(l) /= a(l,l);
276}
277
278return det;
279}
280
[299]281TMatrix<r_8> TMatrix<r_8>::Inverse() const
282// Inversion
283{
[304]284TMatrix<r_8> b(mNc,mNr); TMatrix<r_8> a(*this); b = 1.;
285if(fabs(TMatrix<r_8>::GausPiv(a,b)) < 1.e-50)
[299]286 throw(MathExc("TMatrix Inverse() Singular Matrix"));
287return b;
288}
289
[302]290#include "generalfit.h"
[299]291//////////////////////////////////////////////////////////
292//**** Residus des fits
[301]293TMatrix<r_8> TMatrix<r_8>::FitResidus(GeneralFit& gfit
294 ,double xorg,double yorg,double dx,double dy)
295// Retourne une classe contenant les residus du fit ``gfit''.
296// On suppose que x=j (colonnes) et y=i (lignes) pour m(i,j).
297// Les coordonnees de l'element (i,j) sont :
298// (i,j) -> x = xorg+j*dx , y = yorg+i*dy
[299]299{
300if(NCols()<=0||NRows()<=0)
301 throw(SzMismatchError("TMatrix::FitResidus size mismatch\n"));
302GeneralFunction* f = gfit.GetFunction();
303if(f==NULL)
304 throw(NullPtrError("TMatrix::FitResidus GeneraFit==NULL\n"));
305int npar = gfit.GetNPar();
306if(npar==0)
307 throw(SzMismatchError("TMatrix::FitResidus GeneraFit 0 parametre\n"));
308double* par = new double[npar];
309{for(int i=0;i<npar;i++) par[i] = gfit.GetParm(i);}
310TMatrix<r_8> m(*this);
[301]311for(uint_4 i=0;i<NRows();i++) for(uint_4 j=0;j<NCols();j++) {
312 double x[2] = {xorg+j*dx,yorg+i*dy};
[299]313 m(i,j) -= f->Value(x,par);
314}
315delete [] par;
316return m;
317}
318
[301]319TMatrix<r_8> TMatrix<r_8>::FitFunction(GeneralFit& gfit
320 ,double xorg,double yorg,double dx,double dy)
321// Retourne une classe contenant la fonction du fit ``gfit''.
322// On suppose que x=j (colonnes) et y=i (lignes) pour m(i,j).
323// Les coordonnees de l'element (i,j) sont :
324// (i,j) -> x = xorg + j*dx , y = yorg + i*dy
[299]325{
326if(NCols()<=0||NRows()<=0)
327 throw(SzMismatchError("TMatrix::FitFunction size mismatch\n"));
328GeneralFunction* f = gfit.GetFunction();
329if(f==NULL)
330 throw(NullPtrError("TMatrix::FitFunction GeneraFit==NULL\n"));
331int npar = gfit.GetNPar();
332if(npar==0)
333 throw(SzMismatchError("TMatrix::FitFunction GeneraFit 0 parametre\n"));
334double* par = new double[npar];
335{for(int i=0;i<npar;i++) par[i] = gfit.GetParm(i);}
336TMatrix<r_8> m(*this);
[301]337for(uint_4 i=0;i<NRows();i++) for(uint_4 j=0;j<NCols();j++) {
338 double x[2] = {xorg+j*dx,yorg+i*dy};
[299]339 m(i,j) = f->Value(x,par);
340}
341delete [] par;
342return m;
343}
344
[304]345///////////////////////////////////////////////////////////
346// --------------------------------------------------------
[286]347// Les objets delegues pour la gestion de persistance
[304]348// --------------------------------------------------------
349///////////////////////////////////////////////////////////
[286]350
351template <class T>
352FIO_TMatrix<T>::FIO_TMatrix()
353{
354dobj=new TMatrix<T>;
355ownobj=true;
356}
357
358template <class T>
359FIO_TMatrix<T>::FIO_TMatrix(string const & filename)
360{
361dobj=new TMatrix<T>;
362ownobj=true;
363Read(filename);
364}
365
366template <class T>
367FIO_TMatrix<T>::FIO_TMatrix(const TMatrix<T> & obj)
368{
369dobj = new TMatrix<T>(obj);
370ownobj=true;
371}
372
373template <class T>
374FIO_TMatrix<T>::FIO_TMatrix(TMatrix<T> * obj)
375{
376dobj = obj;
377ownobj=false;
378}
379
380template <class T>
381FIO_TMatrix<T>::~FIO_TMatrix()
382{
383if (ownobj && dobj) delete dobj;
384}
385
386template <class T>
387AnyDataObj* FIO_TMatrix<T>::DataObj()
388{
389return(dobj);
390}
391
392
393template <class T>
394void FIO_TMatrix<T>::ReadSelf(PInPersist& is)
395{
396// On lit les 3 premiers uint_8
[291]397// 0: Numero de version, 1 : NRows, 2 : NCol
398uint_4 itab[3];
399is.Get(itab,3);
400if (dobj == NULL) dobj = new TMatrix<T>(itab[1],itab[2]);
401else dobj->ReSize(itab[1],itab[2]);
[286]402// On lit le NDataBlock
[291]403FIO_NDataBlock<T> fio_nd(&dobj->DataBlock());
404fio_nd.Read(is);
[286]405}
406
407template <class T>
408void FIO_TMatrix<T>::WriteSelf(POutPersist& os) const
409{
410if (dobj == NULL) return;
[291]411// On ecrit 3 uint_4 ....
412// 0: Numero de version, 1 : NRows, 2 : NCol
413uint_4 itab[3];
414 itab[0] = 1; // Numero de version a 1
415itab[1] = dobj->NRows();
416itab[2] = dobj->NCols();
417os.Put(itab,3);
[286]418// On ecrit le NDataBlock
[291]419FIO_NDataBlock<T> fio_nd(&dobj->DataBlock());
420fio_nd.Write(os);
[286]421}
422
[304]423////////////////////////////////////////////////////////////////
424// -------------------------------------------------------------
425// La classe de gestion des lignes et colonnes d'une matrice
426// -------------------------------------------------------------
427////////////////////////////////////////////////////////////////
428#include "tvector.h"
429
430template <class T> TMatrixRC<T>::TMatrixRC()
431: matrix(NULL), data(NULL), index(0), step(0)
432{}
433
434template <class T> TMatrixRC<T>::TMatrixRC(TMatrix<T>& m,TRCKind rckind,uint_4 ind)
435: matrix(&m), data(Org(m,rckind,ind)),
436 index(ind), step(Step(m,rckind)), kind(rckind)
437{
438if (kind == TmatrixDiag && m.mNc != m.mNr)
439 throw(SzMismatchError("TMatrixRC::TMatrixRC(...,TmatrixDiag,...) size mismatch\n"));
440}
441
442template <class T> int_4 TMatrixRC<T>::Next()
443{
444if (!matrix || kind==TmatrixDiag) return -1;
445index++;
446if(kind == TmatrixRow) {
447 if(index > (int_4)matrix->mNr) {index = (int_4)matrix->mNr; return -1;}
448 data += matrix->mNc;
449} else {
450 if (index > (int_4)matrix->mNc) {index = (int_4)matrix->mNc; return -1;}
451 data++;
452}
453return index;
454}
455
456template <class T> int_4 TMatrixRC<T>::Prev()
457{
458if (!matrix || kind == TmatrixDiag) return -1;
459index--;
460if(index < 0) {index = 0; return -1;}
461if(kind == TmatrixRow) data -= matrix->mNc;
462else data--;
463return index;
464}
465
466template <class T> int_4 TMatrixRC<T>::SetCol(int_4 c)
467{
468if(!matrix) return -1;
469if(c<0 || c>(int_4)matrix->mNc) return -1;
470kind = TmatrixCol;
471index = c;
472step = Step(*matrix, TmatrixCol);
473data = Org(*matrix, TmatrixCol, c);
474return c;
475}
476
477template <class T> int_4 TMatrixRC<T>::SetRow(int_4 r)
478{
479if(!matrix) return -1;
480if(r<0 && r>(int_4)matrix->mNr) return -1;
481kind = TmatrixRow;
482index = r;
483step = Step(*matrix, TmatrixRow);
484data = Org(*matrix, TmatrixRow, r);
485return r;
486}
487
488template <class T> int_4 TMatrixRC<T>::SetDiag()
489{
490if (!matrix) return -1;
491if (matrix->mNc != matrix->mNr)
492 throw(SzMismatchError("TMatrixRC::SetDiag size mismatch\n"));
493kind = TmatrixDiag;
494index = 0;
495step = Step(*matrix, TmatrixDiag);
496data = Org(*matrix, TmatrixDiag);
497return 0;
498}
499
500
501template <class T> TMatrixRC<T>& TMatrixRC<T>::operator = (const TMatrixRC<T>& rc)
502{
503matrix = rc.matrix;
504data = rc.data;
505index = rc.index;
506step = rc.step;
507kind = rc.kind;
508return *this;
509}
510
511template <class T> TVector<T> TMatrixRC<T>::GetVect() const
512{
513TVector<T> v(NElts());
514for (uint_4 i=0; i<NElts(); i++) v(i) = (*this)(i);
515return v;
516}
517
518template <class T> TMatrixRC<T>& TMatrixRC<T>::operator += (const TMatrixRC<T>& rc)
519{
520if ( NElts() != rc.NElts() )
521 throw(SzMismatchError("TMatrixRC::operator+= size mismatch\n"));
522if ( kind != rc.kind )
523 throw(SzMismatchError("TMatrixRC::operator+= type mismatch\n"));
524for (uint_4 i=0; i<NElts(); i++) (*this)(i) += rc(i);
525return *this;
526}
527
528template <class T> TMatrixRC<T>& TMatrixRC<T>::operator -= (const TMatrixRC<T>& rc)
529{
530if( NElts() != rc.NElts() )
531 throw(SzMismatchError("TMatrixRC::operator-= size mismatch\n"));
532if( kind != rc.kind )
533 throw(SzMismatchError("TMatrixRC::operator-= type mismatch\n"));
534for(uint_4 i=0; i<NElts(); i++) (*this)(i) -= rc(i);
535return *this;
536}
537
538
539template <class T> TMatrixRC<T>& TMatrixRC<T>::operator *= (T x)
540{
541for(uint_4 i=0; i<NElts(); i++) (*this)(i) *= x;
542return *this;
543}
544
545template <class T> TMatrixRC<T>& TMatrixRC<T>::operator /= (T x)
546{
547for(uint_4 i=0; i<NElts(); i++) (*this)(i) /= x;
548return *this;
549}
550
551
552template <class T> TMatrixRC<T>& TMatrixRC<T>::operator -= (T x)
553{
554for(uint_4 i=0; i<NElts(); i++) (*this)(i) -= x;
555return *this;
556}
557
558template <class T> TMatrixRC<T>& TMatrixRC<T>::operator += (T x)
559{
560for(uint_4 i=0; i<NElts(); i++) (*this)(i) += x;
561return *this;
562}
563
564template <class T>
565TMatrixRC<T>& TMatrixRC<T>::LinComb(T a, T b, const TMatrixRC<T>& rc, uint_4 first)
566{
567if ( NElts() != rc.NElts() )
568 throw(SzMismatchError("TMatrixRC::LinComb size mismatch\n"));
569if ( kind != rc.kind )
570 throw(SzMismatchError("TMatrixRC::LinComb type mismatch\n"));
571for(uint_4 i=first; i<NElts(); i++) (*this)(i) = (*this)(i)*a + rc(i)*b;
572return *this;
573}
574
575template <class T>
576TMatrixRC<T>& TMatrixRC<T>::LinComb(T b, const TMatrixRC<T>& rc, uint_4 first)
577{
578if ( NElts() != rc.NElts() )
579 throw(SzMismatchError("TMatrixRC::LinComb size mismatch\n"));
580if ( kind != rc.kind )
581 throw(SzMismatchError("TMatrixRC::LinComb type mismatch\n"));
582for(uint_4 i=first; i<NElts(); i++) (*this)(i) += rc(i)*b;
583return *this;
584}
585
586template <class T> uint_4 TMatrixRC<T>::IMaxAbs(uint_4 first)
587{
588if (first>NElts())
589 throw(SzMismatchError("TMatrixRC::IMaxAbs size mismatch\n"));
590uint_4 imax = first;
591double vmax = Abs_Value((*this)(first));
592for(uint_4 i=first+1; i<NElts(); i++) {
593 double v = Abs_Value((*this)(i));
594 if(v > vmax) {vmax = v; imax = i;}
595}
596return imax;
597}
598
599template <class T>
600void TMatrixRC<T>::Swap(TMatrixRC<T>& rc1, TMatrixRC<T>& rc2)
601{
602if(rc1.NElts() != rc2.NElts())
603 throw(SzMismatchError("TMatrixRC::Swap size mismatch\n"));
604if(rc1.kind != rc2.kind)
605 throw(SzMismatchError("TMatrixRC::Swap type mismatch\n"));
606if(rc1.data == rc2.data) return;
607for(uint_4 i=0; i<rc1.NElts(); i++)
608 {T tmp = rc1(i); rc1(i) = rc2(i); rc2(i) = tmp;}
609}
610
[279]611///////////////////////////////////////////////////////////////
612#ifdef __CXX_PRAGMA_TEMPLATES__
613#pragma define_template TMatrix<uint_1>
614#pragma define_template TMatrix<uint_2>
615#pragma define_template TMatrix<int_2>
616#pragma define_template TMatrix<int_4>
617#pragma define_template TMatrix<int_8>
618#pragma define_template TMatrix<uint_4>
619#pragma define_template TMatrix<uint_8>
620#pragma define_template TMatrix<r_4>
621#pragma define_template TMatrix<r_8>
[286]622#pragma define_template TMatrix< complex<float> >
623#pragma define_template TMatrix< complex<double> >
[279]624// Instances des delegues FileIO (PPersist)
[286]625#pragma define_template FIO_TMatrix<uint_1>
626#pragma define_template FIO_TMatrix<uint_2>
627#pragma define_template FIO_TMatrix<int_2>
628#pragma define_template FIO_TMatrix<int_4>
629#pragma define_template FIO_TMatrix<int_8>
630#pragma define_template FIO_TMatrix<uint_4>
631#pragma define_template FIO_TMatrix<uint_8>
632#pragma define_template FIO_TMatrix<r_8>
633#pragma define_template FIO_TMatrix<r_4>
634#pragma define_template FIO_TMatrix< complex<float> >
635#pragma define_template FIO_TMatrix< complex<double> >
[304]636// Instances gestion lignes/colonnes
637#pragma define_template TMatrixRC<uint_1>
638#pragma define_template TMatrixRC<uint_2>
639#pragma define_template TMatrixRC<int_2>
640#pragma define_template TMatrixRC<int_4>
641#pragma define_template TMatrixRC<int_8>
642#pragma define_template TMatrixRC<uint_4>
643#pragma define_template TMatrixRC<uint_8>
644#pragma define_template TMatrixRC<r_4>
645#pragma define_template TMatrixRC<r_8>
646#pragma define_template TMatrixRC< complex<float> >
647#pragma define_template TMatrixRC< complex<double> >
[279]648#endif
649
650#if defined(ANSI_TEMPLATES) || defined(GNU_TEMPLATES)
651template class TMatrix<uint_1>;
652template class TMatrix<uint_2>;
653template class TMatrix<int_2>;
654template class TMatrix<int_4>;
655template class TMatrix<int_8>;
656template class TMatrix<uint_4>;
657template class TMatrix<uint_8>;
658template class TMatrix<r_4>;
659template class TMatrix<r_8>;
660template class TMatrix< complex<float> >;
661template class TMatrix< complex<double> >;
662// Instances des delegues FileIO (PPersist)
[286]663template class FIO_TMatrix<uint_1>;
664template class FIO_TMatrix<uint_2>;
665template class FIO_TMatrix<int_2>;
666template class FIO_TMatrix<int_4>;
667template class FIO_TMatrix<int_8>;
668template class FIO_TMatrix<uint_4>;
669template class FIO_TMatrix<uint_8>;
670template class FIO_TMatrix<r_8>;
671template class FIO_TMatrix<r_4>;
672template class FIO_TMatrix< complex<float> >;
673template class FIO_TMatrix< complex<double> >;
[304]674// Instances gestion lignes/colonnes
675template class TMatrixRC<uint_1>;
676template class TMatrixRC<uint_2>;
677template class TMatrixRC<int_2>;
678template class TMatrixRC<int_4>;
679template class TMatrixRC<int_8>;
680template class TMatrixRC<uint_4>;
681template class TMatrixRC<uint_8>;
682template class TMatrixRC<r_4>;
683template class TMatrixRC<r_8>;
684template class TMatrixRC< complex<float> >;
685template class TMatrixRC< complex<double> >;
[279]686#endif
Note: See TracBrowser for help on using the repository browser.