source: Sophya/trunk/SophyaLib/NTools/tmatrix.h@ 303

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

cmv 18/5/99

File size: 7.1 KB
RevLine 
[279]1// This may look like C code, but it is really -*- C++ -*-
2// C.Magneville 04/99
3#ifndef TMATRIX_SEEN
4#define TMATRIX_SEEN
5
6#include "machdefs.h"
7#include <stdio.h>
8#include <iostream.h>
9#include "ppersist.h"
10#include "anydataobj.h"
11#include "ndatablock.h"
[299]12class GeneralFit;
[279]13
14namespace PlanckDPC {
15
16template <class T>
17class TMatrix : public AnyDataObj {
18public:
[288]19
[279]20 // Creation / destruction
21 TMatrix();
22 TMatrix(uint_4 r,uint_4 c);
23 TMatrix(uint_4 r,uint_4 c,T* values,Bridge* br=NULL);
24 TMatrix(const TMatrix<T>& a);
25 TMatrix(const TMatrix<T>& a,bool share);
26 virtual ~TMatrix();
27
[286]28 // Temporaire?
29 inline bool IsTemp(void) const {return mNDBlock.IsTemp();}
[288]30 inline void SetTemp(bool temp=false) const {mNDBlock.SetTemp(temp);}
[286]31
[279]32 // Gestion taille/Remplissage
[288]33 inline void Clone(const TMatrix<T>& a) // Clone: copie des donnees de "a"
34 {mNDBlock.Clone(a.mNDBlock); mNr = a.mNr; mNc = a.mNc;}
35 inline void Reset(T v=0) {mNDBlock.Reset(v);}
36 inline void ReSize(uint_4 r,uint_4 c) // Reallocation de place
37 {if(r==0||c==0) throw(SzMismatchError("TMatrix::ReSize r ou c==0\n"));
38 mNr = r; mNc = c; mNDBlock.ReSize(r*c);}
[279]39
40 // Informations pointeur/data
[302]41 inline uint_4 NRows() const {return mNr;}
42 inline uint_4 NCols() const {return mNc;}
[288]43 inline T const& operator()(uint_4 r,uint_4 c) const
44 {return *(mNDBlock.Begin()+r*mNc+c);}
45 inline T& operator()(uint_4 r,uint_4 c)
46 {return *(mNDBlock.Begin()+r*mNc+c);}
47 inline T const& operator[](uint_4 ip) const
48 {return *(mNDBlock.Begin()+ip);}
49 inline T& operator[](uint_4 ip)
50 {return *(mNDBlock.Begin()+ip);}
[286]51 inline T* Data() {return mNDBlock.Begin();}
52 inline const T* Data() const {return mNDBlock.Begin();}
53 inline NDataBlock<T>& DataBlock() {return mNDBlock;}
54 inline const NDataBlock<T>& DataBlock() const {return mNDBlock;}
[279]55
[288]56 // Operations matricielles
57 TMatrix<T> Transpose(void) const;
58
[279]59 // Operateur d'affectation
[288]60 // A = x (matrice diagonale x*Identite)
61 inline TMatrix<T>& operator = (T x)
62 {if(mNr!=mNc || mNr==0) throw(SzMismatchError("TMatrix::operator= mNc!=mNr ou ==0\n"));
63 for(uint_4 r=0;r<mNr;r++) for(uint_4 c=0;c<mNc;c++) (*this)(r,c)=(r==c)?x:0;
64 return *this;}
65 // A = B : partage les donnees si "a" est temporaire, clone sinon.
66 inline TMatrix<T>& operator = (const TMatrix<T>& a)
67 {if(this == &a) return *this; CloneOrShare(a); return *this;}
[279]68
69 // Impression
70 void Print(ostream& os,int lp=0,uint_4 i0=0,uint_4 ni=10,uint_4 j0=0,uint_4 nj=10) const;
71 inline void Print(int lp=0,uint_4 i0=0,uint_4 ni=10,uint_4 j0=0,uint_4 nj=10) const
72 {Print(cout,lp,i0,ni,j0,nj);}
73
[288]74 // Surcharge d'operateurs INPLACE: A (+=,-=,*=,/=) (T) x
75 inline TMatrix<T>& operator += (T b) {mNDBlock += b; return *this;}
76 inline TMatrix<T>& operator -= (T b) {mNDBlock -= b; return *this;}
77 inline TMatrix<T>& operator *= (T b) {mNDBlock *= b; return *this;}
78 inline TMatrix<T>& operator /= (T b) {mNDBlock /= b; return *this;}
[279]79
[288]80 // Surcharge d'operateurs INPLACE: A (+=,-=,*=,/=) B
81 inline TMatrix<T>& operator += (const TMatrix<T>& a)
82 {if(mNr==0 || mNc==0 || mNr!=a.mNr || mNc!=a.mNc)
83 throw(SzMismatchError("TMatrix::operator+=A size mismatch"));
84 mNDBlock += a.mNDBlock; return *this;}
85 inline TMatrix<T>& operator -= (const TMatrix<T>& a)
86 {if(mNr==0 || mNc==0 || mNr!=a.mNr || mNc!=a.mNc)
87 throw(SzMismatchError("TMatrix::operator-=A size mismatch"));
88 mNDBlock -= a.mNDBlock; return *this;}
[279]89 TMatrix<T>& operator *= (const TMatrix<T>& a);
90
[288]91 // Pour surcharge d'operateurs C = A (+,-,*) B
[286]92 TMatrix<T> Add(const TMatrix<T>& b) const;
93 TMatrix<T> Sub(const TMatrix<T>& b) const;
94 TMatrix<T> Mul(const TMatrix<T>& b) const;
95
[299]96 // Pivot de Gauss : diagonalise la matrice A, en effectuant les memes
97 // operations sur la matrice B
98 TMatrix<T> Inverse() const;
99 static T GausPiv(TMatrix<T>& A, TMatrix<T>& B);
100
101 // Residus et fonction fittees.
[301]102 TMatrix<T> FitResidus(GeneralFit& gfit
103 ,double xorg=0.,double yorg=0.,double dx=1.,double dy=1.);
104 TMatrix<T> FitFunction(GeneralFit& gfit
105 ,double xorg=0.,double yorg=0.,double dx=1.,double dy=1.);
[299]106
[279]107protected:
[288]108 // partage les donnees si "a" temporaire, clone sinon.
109 inline void CloneOrShare(const TMatrix<T>& a)
110 {mNDBlock.CloneOrShare(a.mNDBlock); mNr=a.mNr; mNc=a.mNc;}
111 // Share: partage les donnees de "a"
112 inline void Share(const TMatrix<T>& a)
113 {mNDBlock.Share(a.mNDBlock); mNr=a.mNr; mNc=a.mNc;}
114
[279]115 uint_4 mNr,mNc;
[286]116 NDataBlock<T> mNDBlock;
[279]117};
118
[288]119////////////////////////////////////////////////////////////////
120// Impression
121
122template <class T>
[279]123inline ostream& operator << (ostream& os, const TMatrix<T>& a)
[288]124 {a.Print(os); return(os);}
[279]125
[288]126////////////////////////////////////////////////////////////////
127// Surcharge d'operateurs A (+=,-=,*=,/=) (T) x
[286]128
[288]129template <class T> inline TMatrix<T> operator + (const TMatrix<T>& a, T b)
130 {TMatrix<T> result(a); result.SetTemp(true); result += b; return result;}
[286]131
[288]132template <class T> inline TMatrix<T> operator + (T b,const TMatrix<T>& a)
133 {TMatrix<T> result(a); result.SetTemp(true); result += b; return result;}
[286]134
[288]135template <class T> inline TMatrix<T> operator - (const TMatrix<T>& a, T b)
136 {TMatrix<T> result(a); result.SetTemp(true); result -= b; return result;}
[286]137
[288]138template <class T> inline TMatrix<T> operator - (T b,const TMatrix<T>& a)
139 {TMatrix<T> result(a); result.SetTemp(true);
140 result.DataBlock() = b-result.DataBlock(); return result;}
[286]141
[288]142template <class T> inline TMatrix<T> operator * (const TMatrix<T>& a, T b)
143 {TMatrix<T> result(a); result.SetTemp(true); result *= b; return result;}
[286]144
[288]145template <class T> inline TMatrix<T> operator * (T b,const TMatrix<T>& a)
146 {TMatrix<T> result(a); result.SetTemp(true); result *= b; return result;}
[286]147
[288]148template <class T> inline TMatrix<T> operator / (const TMatrix<T>& a, T b)
149 {TMatrix<T> result(a); result.SetTemp(true); result /= b; return result;}
150
151////////////////////////////////////////////////////////////////
152// Surcharge d'operateurs C = A (+,-,*,/) B
153
154template <class T>
[286]155inline TMatrix<T> operator + (const TMatrix<T>& a,const TMatrix<T>& b)
[288]156 {return a.Add(b);}
[286]157
[288]158template <class T>
[286]159inline TMatrix<T> operator - (const TMatrix<T>& a,const TMatrix<T>& b)
[288]160 {return a.Sub(b);}
[286]161
[288]162template <class T>
[286]163inline TMatrix<T> operator * (const TMatrix<T>& a,const TMatrix<T>& b)
[288]164 {return a.Mul(b);}
[286]165
[288]166
[286]167/////////////////////////////////////////////////////////////////////////
168// Classe pour la gestion de persistance
169template <class T>
170class FIO_TMatrix : public PPersist {
171public:
[288]172 FIO_TMatrix();
173 FIO_TMatrix(string const & filename);
174 FIO_TMatrix(const TMatrix<T> & obj);
175 FIO_TMatrix(TMatrix<T> * obj);
176 virtual ~FIO_TMatrix();
177 virtual AnyDataObj* DataObj();
[286]178 inline operator TMatrix<T>() { return(*dobj); }
179protected :
[288]180 virtual void ReadSelf(PInPersist&);
181 virtual void WriteSelf(POutPersist&) const;
[286]182 TMatrix<T> * dobj;
183 bool ownobj;
184};
185
[279]186} // Fin du namespace
187
188#endif
Note: See TracBrowser for help on using the repository browser.