Changeset 304 in Sophya for trunk/SophyaLib/NTools/tmatrix.h


Ignore:
Timestamp:
May 18, 1999, 7:19:37 PM (26 years ago)
Author:
ansari
Message:

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:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/SophyaLib/NTools/tmatrix.h

    r302 r304  
    77#include <stdio.h>
    88#include <iostream.h>
     9#include <complex>
    910#include "ppersist.h"
    1011#include "anydataobj.h"
    1112#include "ndatablock.h"
     13
    1214class GeneralFit;
    1315
    1416namespace PlanckDPC {
    1517
     18template <class T> class TVector;
     19template <class T> class TMatrixRC;
     20
    1621template <class T>
    1722class TMatrix : public AnyDataObj {
     23  friend class TMatrixRC<T>;
     24  friend class TVector<T>;
    1825public:
    1926
     
    105112            ,double xorg=0.,double yorg=0.,double dx=1.,double dy=1.);
    106113
     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
    107119protected:
    108120  // partage les donnees si "a" temporaire, clone sinon.
     
    184196};
    185197
     198/////////////////////////////////////////////////////////////////////////
     199// Classe de lignes/colonnes de matrices
     200enum TRCKind {TmatrixRow=0, TmatrixCol=1, TmatrixDiag=2};
     201template <class T>
     202class TMatrixRC {
     203  friend class TVector<T>;
     204  friend class TMatrix<T>;
     205public:
     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
     241protected:
     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
     265template <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
     276template <class T>
     277inline 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
     283template <class T>
     284inline 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
     290template <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
     297template <class T>
     298inline T& TMatrixRC<T>::operator()(uint_4 i) {return data[i*step];}
     299template <class T>
     300inline T  TMatrixRC<T>::operator()(uint_4 i) const {return data[i*step];}
     301
    186302} // Fin du namespace
    187303
Note: See TracChangeset for help on using the changeset viewer.