00001 #ifndef MATRIX_HPP
00002 #define MATRIX_HPP
00003
00004 #ifndef HANDLEXCEPTION
00005 #define HANDLEXCEPTION 0
00006 #endif
00007
00019
00020
00022 class Vector {
00023 public:
00025 Vector() { }
00027 virtual ~Vector() { }
00029 virtual double elem(unsigned i) const = 0;
00031 virtual unsigned GetSize() const = 0;
00032 };
00033
00035 class Matrix {
00036 public:
00038 Matrix() { }
00040 virtual ~Matrix() { }
00042 virtual unsigned GetNumRows() const = 0;
00044 virtual unsigned GetNumCols() const = 0;
00046 virtual double elem(unsigned i, unsigned j) const = 0;
00047
00049
00052 class Row : public Vector {
00053 friend class Matrix;
00054 const Matrix* M;
00055 const unsigned i;
00056 Row(const Matrix* _M, unsigned _i);
00057 public:
00058 double elem(unsigned j) const;
00059 unsigned GetSize() const;
00060 };
00062 Row GetRow(unsigned i) const;
00064
00067 class Column : public Vector {
00068 friend class Matrix;
00069 const Matrix* M;
00070 const unsigned j;
00071 Column(const Matrix* _M, unsigned _j);
00072 public:
00073 double elem(unsigned i) const;
00074 unsigned GetSize() const;
00075 };
00077 Column GetCol(unsigned j) const;
00078 };
00079
00080
00082 class MatrixBinExpr : public Matrix {
00083 protected:
00084 const Matrix& M1;
00085 const Matrix& M2;
00086 public:
00088 MatrixBinExpr(const Matrix& _M1, const Matrix& _M2);
00089
00090
00092 const Matrix& GetFirst() const;
00094 const Matrix& GetSecond() const;
00095 unsigned GetNumRows() const;
00096 unsigned GetNumCols() const;
00097 };
00098
00100 class MatrixSum : public MatrixBinExpr {
00101 public:
00103 MatrixSum(const Matrix& _M1, const Matrix& _M2);
00104 double elem(unsigned i, unsigned j) const;
00105 };
00106
00108 class MatrixSub : public MatrixBinExpr {
00109 public:
00111 MatrixSub(const Matrix& _M1, const Matrix& _M2);
00112 double elem(unsigned i, unsigned j) const;
00113 };
00114
00116 enum {ReallocatableMatrix_add_allocsize = 10};
00117
00119
00122 class ReallocatableMatrix : public Matrix {
00123 unsigned num_rows;
00124 unsigned num_cols;
00125 unsigned allocsize;
00126 double **mat;
00127 public:
00129 ReallocatableMatrix(unsigned rows, unsigned start_cols);
00130 unsigned GetNumRows() const;
00131 unsigned GetNumCols() const;
00133 void Resize(unsigned needsize);
00135 double& elem(unsigned i, unsigned j);
00136 double elem(unsigned i, unsigned j) const;
00138 ~ReallocatableMatrix();
00139 };
00140
00142 class FunctionMatrix : public Matrix {
00143 unsigned num_rows;
00144 unsigned num_cols;
00145 double h;
00146 double (*f)(unsigned, unsigned, double);
00147 public:
00149 FunctionMatrix(unsigned rows, unsigned cols, double _h,
00150 double (*func)(unsigned, unsigned, double));
00151 unsigned GetNumRows() const;
00152 unsigned GetNumCols() const;
00153 double elem(unsigned i, unsigned j) const;
00154 };
00155
00156 #endif