Changeset 772 in Sophya for trunk/SophyaLib/TArray/tmatrix.h
- Timestamp:
- Mar 10, 2000, 4:13:22 PM (26 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/SophyaLib/TArray/tmatrix.h
r762 r772 14 14 namespace SOPHYA { 15 15 16 template <class T> class TVector;17 template <class T> class TMatrixRC;18 19 16 template <class T> 20 17 class TMatrix : public AnyDataObj { 21 friend class TMatrixRC<T>;22 friend class TVector<T>;23 18 public: 24 19 … … 103 98 TMatrix<T> Mul(const TMatrix<T>& b) const; 104 99 105 // Pivot de Gauss : diagonalise la matrice A, en effectuant les memes106 // operations sur la matrice B107 TMatrix<T> Inverse() const;108 static T GausPiv(TMatrix<T>& A, TMatrix<T>& B);109 110 // Acces aux rangees et colonnes111 TMatrixRC<T> Row(uint_4 r) const;112 TMatrixRC<T> Col(uint_4 c) const;113 TMatrixRC<T> Diag() const;114 100 115 101 protected: … … 203 189 { FIO_TMatrix<T> fio(&obj); fio.Read(is); return(is); } 204 190 205 /////////////////////////////////////////////////////////////////////////206 // Classe de lignes/colonnes de matrices207 enum TRCKind {TmatrixRow=0, TmatrixCol=1, TmatrixDiag=2};208 template <class T>209 class TMatrixRC {210 friend class TVector<T>;211 friend class TMatrix<T>;212 public:213 TMatrixRC();214 215 virtual ~TMatrixRC() {}216 217 int_4 Next();218 int_4 Prev();219 int_4 SetCol(int_4 c);220 int_4 SetRow(int_4 r);221 int_4 SetDiag();222 223 static uint_4 Step(const TMatrix<T>& m, TRCKind rckind);224 static T* Org(const TMatrix<T>&, TRCKind rckind, uint_4 ind=0);225 226 TRCKind Kind() const { return kind; }227 uint_4 NElts() const;228 T& operator()(uint_4 i);229 T operator()(uint_4 i) const;230 231 TMatrixRC<T>& operator = (const TMatrixRC<T>& rc);232 TVector<T> GetVect() const;233 234 TMatrixRC<T>& operator += (const TMatrixRC<T>& rc);235 TMatrixRC<T>& operator -= (const TMatrixRC<T>& rc);236 237 TMatrixRC<T>& operator *= (T x);238 TMatrixRC<T>& operator /= (T x);239 TMatrixRC<T>& operator -= (T x);240 TMatrixRC<T>& operator += (T x);241 242 TMatrixRC<T>& LinComb(T a, T b, const TMatrixRC& rc, uint_4 first=0);243 TMatrixRC<T>& LinComb(T b, const TMatrixRC<T>& rc, uint_4 first=0);244 245 uint_4 IMaxAbs(uint_4 first=0);246 247 static void Swap(TMatrixRC<T>& rc1, TMatrixRC<T>& rc2);248 249 protected:250 TMatrixRC(TMatrix<T>& m, TRCKind kind, uint_4 index=0);251 TMatrix<T>* matrix;252 inline static double Abs_Value(uint_1 v) {return (double) v;}253 inline static double Abs_Value(uint_2 v) {return (double) v;}254 inline static double Abs_Value(int_2 v) {return (v>0)? (double) v: (double) -v;}255 inline static double Abs_Value(int_4 v) {return (v>0)? (double) v: (double) -v;}256 inline static double Abs_Value(int_8 v) {return (v>0)? (double) v: (double) -v;}257 inline static double Abs_Value(uint_4 v) {return (double) v;}258 inline static double Abs_Value(uint_8 v) {return (double) v;}259 inline static double Abs_Value(r_4 v) {return (double) fabsf(v);}260 inline static double Abs_Value(r_8 v) {return fabs(v);}261 inline static double Abs_Value(complex<float> v)262 {return sqrt(v.real()*v.real()+v.imag()*v.imag());}263 inline static double Abs_Value(complex<double> v)264 {return sqrt(v.real()*v.real()+v.imag()*v.imag());}265 266 T* data;267 int_4 index;268 uint_4 step;269 TRCKind kind;270 };271 272 273 template <class T>274 inline T operator * (const TMatrixRC<T>& a, const TMatrixRC<T>& b)275 {276 if ( a.NElts() != b.NElts() )277 throw(SzMismatchError("TMatrixRC::operator * size mismatch\n"));278 if ( a.Kind() != b.Kind() )279 throw(SzMismatchError("TMatrixRC::operator * type mismatch\n"));280 T sum = 0;281 for(uint_4 i=0; i<a.NElts(); i++) sum += a(i)*b(i);282 return sum;283 }284 285 template <class T>286 inline uint_4 TMatrixRC<T>::Step(const TMatrix<T>& m, TRCKind rckind)287 { switch (rckind) { case TmatrixRow : return 1;288 case TmatrixCol : return m.mNc;289 case TmatrixDiag : return m.mNc+1; }290 return 0; }291 292 template <class T>293 inline T* TMatrixRC<T>::Org(const TMatrix<T>& m, TRCKind rckind, uint_4 index)294 { switch (rckind) { case TmatrixRow : return const_cast<T *>(m.Data()) + index * m.mNc;295 case TmatrixCol : return const_cast<T *>(m.Data()) + index;296 case TmatrixDiag : return const_cast<T *>(m.Data()); }297 return NULL; }298 299 template <class T> inline uint_4 TMatrixRC<T>::NElts() const300 { if (!matrix) return 0;301 switch (kind) { case TmatrixRow : return matrix->mNc;302 case TmatrixCol : return matrix->mNr;303 case TmatrixDiag : return matrix->mNc; }304 return 0; }305 306 template <class T>307 inline T& TMatrixRC<T>::operator()(uint_4 i) {return data[i*step];}308 template <class T>309 inline T TMatrixRC<T>::operator()(uint_4 i) const {return data[i*step];}310 311 ////////////////////////////////////////////////////////////////312 // Typedef pour simplifier et compatibilite Peida313 typedef TMatrixRC<r_8> MatrixRC;314 191 315 192 } // Fin du namespace
Note:
See TracChangeset
for help on using the changeset viewer.