home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / diverses / leda / incl / matrix.h < prev    next >
Encoding:
C/C++ Source or Header  |  1991-11-15  |  3.7 KB  |  159 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  2.1.1                                                 11-15-1991
  4. +
  5. +
  6. +  matrix.h
  7. +
  8. +
  9. +  Copyright (c) 1991  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15.  
  16.  
  17. //------------------------------------------------------------------------------
  18. //  matrices
  19. //
  20. //  Stefan Naeher (1988)
  21. //------------------------------------------------------------------------------
  22.  
  23. #ifndef MATRIXH
  24. #define MATRIXH
  25.  
  26. #ifndef MATRIX_DEFAULT_DIM1
  27. #define MATRIX_DEFAULT_DIM1 2
  28. #endif
  29.  
  30. #ifndef MATRIX_DEFAULT_DIM2
  31. #define MATRIX_DEFAULT_DIM2 2
  32. #endif
  33.  
  34.  
  35.  
  36. #include <LEDA/basic.h>
  37. #include <LEDA/vector.h>
  38.  
  39.  
  40.  
  41. struct matrix_rep {
  42.  
  43.    vector* v;
  44.    int  dim1;
  45.    int  dim2;
  46.  
  47.  matrix_rep(int, int);
  48.  matrix_rep(const matrix_rep*);
  49.  matrix_rep(int,int,double**);
  50.  
  51. ~matrix_rep();
  52.  
  53. OPERATOR_NEW(3)
  54. OPERATOR_DEL(3)
  55.  
  56. };
  57.  
  58.  
  59.  
  60. class matrix{
  61.  
  62.    matrix_rep* ptr;
  63.  
  64. void check_dimensions(const matrix&) const; 
  65.  
  66. void flip_rows(int i,int j)
  67. { vector_rep* p = ptr->v[i].ptr;
  68.   ptr->v[i].ptr = ptr->v[j].ptr;
  69.   ptr->v[j].ptr = p;
  70. }
  71.  
  72. double  elem(int i, int j) const { return ptr->v[i].ptr->v[j]; }
  73.  
  74. double** triang(const matrix&, int&) const;
  75.  
  76. public:
  77.  
  78.  
  79. matrix()  { ptr = new matrix_rep(MATRIX_DEFAULT_DIM1,MATRIX_DEFAULT_DIM2); }
  80.  
  81. matrix(int d1, int d2)             { ptr = new matrix_rep(d1,d2); }
  82. matrix(int d1, int d2, double** p) { ptr = new matrix_rep(d1,d2,p); }
  83. matrix(const matrix& mat) { ptr = new matrix_rep(mat.ptr); }
  84. matrix(void* p)           { ptr = new matrix_rep((matrix_rep*) p ); }
  85.  
  86. matrix(const vector&);
  87.  
  88. void clear() { delete ptr; }
  89.  
  90. ~matrix()    { clear(); } 
  91.  
  92. int     dim1()  const  {  return ptr->dim1; }
  93. int     dim2()  const  {  return ptr->dim2; }
  94.  
  95. vector& row(int) const;
  96. vector  col(int i) const;
  97. matrix  trans() const;
  98.  
  99. matrix  inv()   const;
  100. double  det()   const;
  101.  
  102. matrix solve(const matrix&) const;
  103. vector solve(const vector& b) const { return solve(matrix(b)); }
  104.  
  105. operator vector() const; 
  106.  
  107. matrix& operator=(const matrix&);
  108.  
  109. int     operator==(const matrix&)    const;
  110. int     operator!=(const matrix& x)  const { return !(*this == x); }
  111.  
  112. vector& operator[](int i)    const { return row(i); }
  113. double  operator()(int, int) const;
  114. double& operator()(int, int);
  115.  
  116. matrix operator+(const matrix&);
  117. matrix operator-(const matrix&);
  118.  
  119. matrix operator*(double);
  120. matrix operator*(const matrix&);
  121. vector operator*(const vector& v) { return vector(*this * matrix(v)); }
  122.  
  123. friend ostream& operator<<(ostream&, const matrix&);
  124. friend istream& operator>>(istream&, matrix&);
  125.  
  126. friend void Print(matrix& M, ostream& out=cout) { out << M; } 
  127. friend void Read(matrix& M, istream& in=cin)  { in >> M; }
  128.  
  129. friend void Clear(matrix& M)      { M.clear(); }
  130. friend ent  Copy(const matrix& M) { return new matrix_rep(M.ptr); }
  131. friend ent  Init(matrix& M)  { return new matrix_rep(M.ptr); }
  132. friend ent  Ent(matrix& M)   { return M.ptr; }
  133.  
  134. friend int  compare(matrix& x, matrix& y) { return int(x.ptr) - int(y.ptr); }
  135.  
  136. };
  137.  
  138.  
  139. //------------------------------------------------------------------------------
  140. // MATRIX(cmp): vector with user defined linear order cmp
  141. //------------------------------------------------------------------------------
  142.  
  143. #define MATRIX(cmp) name2(matrix_,cmp)
  144.  
  145. #define MATRIXdeclare(cmp)\
  146. struct MATRIX(cmp) : public matrix \
  147. {  MATRIX(cmp)(ent p)          :(p)     {}\
  148.    MATRIX(cmp)(int d1, int d2) :(d1,d2) {}\
  149.    MATRIX(cmp)(matrix  m )     :(m)     {}\
  150.    MATRIX(cmp)(MATRIX(cmp)& m) :(m)     {}\
  151.    MATRIX(cmp)() {}\
  152.  ~ MATRIX(cmp)() {}\
  153. };\
  154. \
  155. int compare(MATRIX(cmp)& x, MATRIX(cmp)& y) { return cmp(x,y); }
  156.  
  157. #endif
  158.