Changeset 304 in Sophya for trunk/SophyaLib/NTools/tmatrix.h
- Timestamp:
- May 18, 1999, 7:19:37 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/NTools/tmatrix.h
r302 r304 7 7 #include <stdio.h> 8 8 #include <iostream.h> 9 #include <complex> 9 10 #include "ppersist.h" 10 11 #include "anydataobj.h" 11 12 #include "ndatablock.h" 13 12 14 class GeneralFit; 13 15 14 16 namespace PlanckDPC { 15 17 18 template <class T> class TVector; 19 template <class T> class TMatrixRC; 20 16 21 template <class T> 17 22 class TMatrix : public AnyDataObj { 23 friend class TMatrixRC<T>; 24 friend class TVector<T>; 18 25 public: 19 26 … … 105 112 ,double xorg=0.,double yorg=0.,double dx=1.,double dy=1.); 106 113 114 // Acces aux rangees et colonnes 115 TMatrixRC<T> Row(uint_4 r) const; 116 TMatrixRC<T> Col(uint_4 c) const; 117 TMatrixRC<T> Diag() const; 118 107 119 protected: 108 120 // partage les donnees si "a" temporaire, clone sinon. … … 184 196 }; 185 197 198 ///////////////////////////////////////////////////////////////////////// 199 // Classe de lignes/colonnes de matrices 200 enum TRCKind {TmatrixRow=0, TmatrixCol=1, TmatrixDiag=2}; 201 template <class T> 202 class TMatrixRC { 203 friend class TVector<T>; 204 friend class TMatrix<T>; 205 public: 206 TMatrixRC(); 207 208 virtual ~TMatrixRC() {} 209 210 int_4 Next(); 211 int_4 Prev(); 212 int_4 SetCol(int_4 c); 213 int_4 SetRow(int_4 r); 214 int_4 SetDiag(); 215 216 static uint_4 Step(const TMatrix<T>& m, TRCKind rckind); 217 static T* Org(const TMatrix<T>&, TRCKind rckind, uint_4 ind=0); 218 219 uint_4 NElts() const; 220 T& operator()(uint_4 i); 221 T operator()(uint_4 i) const; 222 223 TMatrixRC<T>& operator = (const TMatrixRC<T>& rc); 224 TVector<T> GetVect() const; 225 226 TMatrixRC<T>& operator += (const TMatrixRC<T>& rc); 227 TMatrixRC<T>& operator -= (const TMatrixRC<T>& rc); 228 229 TMatrixRC<T>& operator *= (T x); 230 TMatrixRC<T>& operator /= (T x); 231 TMatrixRC<T>& operator -= (T x); 232 TMatrixRC<T>& operator += (T x); 233 234 TMatrixRC<T>& LinComb(T a, T b, const TMatrixRC& rc, uint_4 first=0); 235 TMatrixRC<T>& LinComb(T b, const TMatrixRC<T>& rc, uint_4 first=0); 236 237 uint_4 IMaxAbs(uint_4 first=0); 238 239 static void Swap(TMatrixRC<T>& rc1, TMatrixRC<T>& rc2); 240 241 protected: 242 TMatrixRC(TMatrix<T>& m, TRCKind kind, uint_4 index=0); 243 TMatrix<T>* matrix; 244 inline static double Abs_Value(uint_1 v) {return (double) v;} 245 inline static double Abs_Value(uint_2 v) {return (double) v;} 246 inline static double Abs_Value(int_2 v) {return (v>0)? (double) v: (double) -v;} 247 inline static double Abs_Value(int_4 v) {return (v>0)? (double) v: (double) -v;} 248 inline static double Abs_Value(int_8 v) {return (v>0)? (double) v: (double) -v;} 249 inline static double Abs_Value(uint_4 v) {return (double) v;} 250 inline static double Abs_Value(uint_8 v) {return (double) v;} 251 inline static double Abs_Value(r_4 v) {return (double) fabsf(v);} 252 inline static double Abs_Value(r_8 v) {return fabs(v);} 253 inline static double Abs_Value(complex<float> v) 254 {return sqrt(v.real()*v.real()+v.imag()*v.imag());} 255 inline static double Abs_Value(complex<double> v) 256 {return sqrt(v.real()*v.real()+v.imag()*v.imag());} 257 258 T* data; 259 int_4 index; 260 uint_4 step; 261 TRCKind kind; 262 }; 263 264 265 template <class T> inline T operator * (const TMatrixRC<T>& a, const TMatrixRC<T>& b) 266 { 267 if ( a.NElts() != b.NElts() ) 268 throw(SzMismatchError("TMatrixRC::operator * size mismatch\n")); 269 if ( a.kind != b.kind ) 270 throw(SzMismatchError("TMatrixRC::operator * type mismatch\n")); 271 T sum = 0; 272 for(uint_4 i=0; i<a.NElts(); i++) sum += a(i)*b(i); 273 return sum; 274 } 275 276 template <class T> 277 inline uint_4 TMatrixRC<T>::Step(const TMatrix<T>& m, TRCKind rckind) 278 { switch (rckind) { case TmatrixRow : return 1; 279 case TmatrixCol : return m.mNc; 280 case TmatrixDiag : return m.mNc+1; } 281 return 0; } 282 283 template <class T> 284 inline T* TMatrixRC<T>::Org(const TMatrix<T>& m, TRCKind rckind, uint_4 index) 285 { switch (rckind) { case TmatrixRow : return const_cast<T *>(m.Data()) + index * m.mNc; 286 case TmatrixCol : return const_cast<T *>(m.Data()) + index; 287 case TmatrixDiag : return const_cast<T *>(m.Data()); } 288 return NULL; } 289 290 template <class T> inline uint_4 TMatrixRC<T>::NElts() const 291 { if (!matrix) return 0; 292 switch (kind) { case TmatrixRow : return matrix->mNc; 293 case TmatrixCol : return matrix->mNr; 294 case TmatrixDiag : return matrix->mNc; } 295 return 0; } 296 297 template <class T> 298 inline T& TMatrixRC<T>::operator()(uint_4 i) {return data[i*step];} 299 template <class T> 300 inline T TMatrixRC<T>::operator()(uint_4 i) const {return data[i*step];} 301 186 302 } // Fin du namespace 187 303
Note:
See TracChangeset
for help on using the changeset viewer.