Derived Class
Derived class and Base class class base_class1 { …..}; class base_calss2 { …..}; class derived_class : public base_class1, public base_class2 { double x, y, z; // constructors derived_class (double r1, double r1, double r3) : base_class1(r1, r2), base_class2(r3); } ;
Properties of a derived class 1.Derived class 擁有 base class 的所有 members 和 member functions. 2. 在建構 derived class 的 constructor 時, 也必須賦予 base class 的建 構規則. 3.Derived class 可以經由 base class 的運算符作 + - * = 等運算. 例如 : dsqMatrix aMtx(n, xarray); dcoVector cVct(n, yarray); droVector rVct(n, yaary); cout << (aMtx*cVct) ; // print (1 x n) matrix; cout << (rVct*Amtx); // print (n x 1) matrix // 運算 aMtx * cVct 是藉由 Matrix(n, n) * Matrix(n, 1) 的規則進行. // 運算 rVct * aMtx 是藉由 Matrix(1, n) * Matrix(n, n) 的規則進行. // cout 也是經由 Matrix 的 overload 進行.
Class Matrix General (n x m) matrix Column Vectors Row vectors Square (nxn) Matrix Hermitian Matrix Define maritrx +,-,* Operations & transport
Class gnrMatrix Class gnrMatrix template class gnrMatrix { protected: int n_row, n_col; XTP *a_mtx; public: // constructors ….. }
Better structure dgrMatrix : (n x m) real matrix And operators cgrMatrix: (n x m) complex matrix And operators Operators between cgrMatrix and dgrMatrix cspmatrix.h csqMatrix : (n x n) complex matrix croVector : (1 x n) complex vector ccoVector : (n x 1) complex vector dspmatrix.h dsqMatrix : (n x n) real matrix droVector : (1 x n) real vector dcoVector : (n x 1) real vector base class derived class
Class dgrMatrix Class dgrMatrix class dgrMatrix { protected: int n_row; int n_col; double* a_mtx; public: ….; } Test program
constructors dgrMatrix() {}; dgrMatrix(const int, const int); dgrMatrix(const int, const int, double*); dgrMatrix(const int, const int, const double); dgrMatrix(const dgrMatrix &); // copy constructor ~dgrMatrix() {delete [] a_mtx;};
Member functions void put (const int i, const int j, const double x) ; void put (const int i, const double x); double get (const int i, const int j) const; double get (const int i) const; double &pos (const int i, const int j) {return this->a_mtx[i*n_col+j];} int ncol () const; int nrow () const; int ndim () const; dgrMatrix transport () const; void print (int) const; double norm () const; double abs () const; dgrMatrix unit () const; dgrMatrix getrow (const int) const; dgrMatrix getcol (const int) const; void putrow (const int, double*); void putcol (const int, double*); double* getarray () const;
i/o stream overload ostream &operator<<(ostream &ous, dgrMatrix mtx) { int i, j, w=8; cout << " row = " << mtx.nrow() << " col = " << mtx.ncol() << "\n"; for (i=0; i<mtx.nrow(); i++) { for (j=0; j<mtx.ncol(); j++) cout << setw(w) << mtx.get(i,j); cout << "\n"; } return ous; } ifstream &operator>>(ifstream &ins, dgrMatrix &mtx) { int i, j; for (i=0; i<mtx.nrow(); i++) { for (j=0; j > mtx.pos(i,j) ; } return ins; }
operators friend class cgrMatrix; dgrMatrix operator- (const dgrMatrix &); dgrMatrix operator+ (const dgrMatrix &, const dgrMatrix &); dgrMatrix operator- (const dgrMatrix &, const dgrMatrix &); dgrMatrix operator* (const double, const dgrMatrix &); dgrMatrix operator* (const dgrMatrix &s, const double x); dgrMatrix operator* (const dgrMatrix &, const dgrMatrix &);
Complex Matrix Complex Matrix class cgrMatrix { protected: int n_row; int n_col; complex *a_mtx; public: ……; } Test code
constructors cgrMatrix() {}; cgrMatrix(const int, const int); cgrMatrix(const int, const int, complex *); cgrMatrix(const int, const int, double *); cgrMatrix(const int, const int, const complex ); cgrMatrix(const int, const int, const double ); cgrMatrix(const cgrMatrix &mx); cgrMatrix(const dgrMatrix &mx);
operators cgrMatrix & operator=(const cgrMatrix &); cgrMatrix & operator=(const dgrMatrix & mx); cgrMatrix operator- (const cgrMatrix &); cgrMatrix operator+ (const cgrMatrix &, const cgrMatrix &); cgrMatrix operator- (const cgrMatrix &, const cgrMatrix &); cgrMatrix operator* (const complex &, const cgrMatrix &); cgrMatrix operator* (const cgrMatrix &, const cgrMatrix &); cgrMatrix operator+ (const dgrMatrix &x1, const cgrMatrix &x2); cgrMatrix operator+ (const cgrMatrix &x1, const dgrMatrix &x2); cgrMatrix operator- (const dgrMatrix &x1, const cgrMatrix &x2); cgrMatrix operator- (const cgrMatrix &x1, const dgrMatrix &x2); cgrMatrix operator* (const double &r, const cgrMatrix &mx); cgrMatrix operator* (const cgrMatrix &mx, const double &r); cgrMatrix operator* (const cgrMatrix &mx, const complex &r); cgrMatrix operator* (const dgrMatrix &m1, const cgrMatrix &m2); cgrMatrix operator* (const cgrMatrix &m1, const dgrMatrix &m2);
dspmatrix.h: real special matrices dspmatrix.h: real special matrices 1.Class dsqMatrix: real square matrix (n x n) 2.Class droVector: real row vector (1 x n) 3.Class dcoVector: real column vector (n x 1).
Class dsqMatrix class dsqMatrix : public dgrMatrix { public: dsqMatrix() : dgrMatrix() {}; dsqMatrix(const int n) : dgrMatrix(n, n){}; dsqMatrix(const int n, const double x) : dgrMatrix(n, n, x){}; dsqMatrix(const int n, double *xpt) : dgrMatrix(n, n, xpt) {}; dsqMatrix(const dsqMatrix &sqx) : dgrMatrix(sqx.nrow(), sqx.ncol(), sqx.getarray()){}; dsqMatrix(const dgrMatrix &grx); // memeber functions double trace() const; // 對角線元素的和 dsqmatrix diagonal() const; // 抽取對角線元素.. };
Class dcoVector class droVector : public dgrMatrix { public: droVector():dgrMatrix(){}; droVector(int n):dgrMatrix(1, n){}; droVector(int n, double x) : dgrMatrix(1, n, x){}; droVector(int n, double *xpt) : dgrMatrix(1, n, xpt){}; droVector(const dgrMatrix &mtx); };
Class dcoVector class dcoVector : public dgrMatrix { public: dcoVector():dgrMatrix(){}; dcoVector(int n):dgrMatrix(n, 1){}; dcoVector(int n, double x) : dgrMatrix(n, 1, x){}; dcoVector(int n, double *xpt) : dgrMatrix(n, 1, xpt){}; dcoVector(const dgrMatrix &mtx); };
cspmatrix: complex special matrix cspmatrix: complex special matrix 1.Class csqMatrix: complex square matrix (n x n) 2.Class croVector: complex row vector (1 x n) 3.Class ccoVector: complex column vector (n x 1).
Class csqMatrix class csqMatrix : public cgrMatrix { public: csqMatrix() : cgrMatrix() {}; csqMatrix(const int n) : cgrMatrix(n, n){}; csqMatrix(const int n, const double x) : cgrMatrix(n, n, x){}; csqMatrix(const int n, const complex x) : cgrMatrix(n, n, x){}; csqMatrix(const int n, double *xpt) : cgrMatrix(n, n, xpt) {}; csqMatrix(const int n, complex *xpt) : cgrMatrix(n, n, xpt) {}; csqMatrix(const dsqMatrix &sqx) : cgrMatrix(sqx.nrow(), sqx.ncol(), sqx.getarray()){}; csqMatrix(const csqMatrix &sqx) : cgrMatrix(sqx.nrow(), sqx.ncol(), sqx.getarray()){}; csqMatrix(const cgrMatrix &); csqMatrix(const dgrMatrix &); // memeber functions complex trace() const; };
Class croVector class croVector : public cgrMatrix { public: croVector():cgrMatrix(){}; croVector(int n):cgrMatrix(1, n){}; croVector(int n, double x) : cgrMatrix(1, n, x){}; croVector(int n, complex x) : cgrMatrix(1, n, x){}; croVector(int n, double *xpt) : cgrMatrix(1, n, xpt){}; croVector(int n, complex *xpt) : cgrMatrix(1, n, xpt){}; croVector(const cgrMatrix &); croVector(const dgrMatrix &); };
Class ccoVector class ccoVector : public cgrMatrix { public: ccoVector():cgrMatrix(){}; ccoVector(int n):cgrMatrix(n, 1){}; ccoVector(int n, double x) : cgrMatrix(n, 1, x){}; ccoVector(int n, complex x) : cgrMatrix(n, 1, x){}; ccoVector(int n, double *xpt) : cgrMatrix(n, 1, xpt){}; ccoVector(int n, complex *xpt) : cgrMatrix(n, 1, xpt){}; ccoVector(const cgrMatrix &); ccoVector(const dgrMatrix &); };
Write your classes for the test code to run … test codetest code // testing headfile cspmatrix.h & dspmatrix.h #include "cspmatrix.h" #include "dspmatrix.h" main() { int i, j; double aary[16]; complex cary[16]; for (i=0; i<16; i++) aary[i] = i ; for (i=0; i (i-8.123, i); dsqMatrix dmtx(4, aary); csqMatrix cmtx(4, cary); ………
Final works -- using matrix classes using iterative method solving 10 linear equations in ttdsp2.txtttdsp2.txt A * X = B (A0 + A1) * X = B separate A into large (diagonal part) A0 and smaller A1. A0 * X = B - A1 * X X = (1/A0 * B) - (1/A0 * A1) *X where 1/A0 is the inverse of A0. Let vector V = (1/A0) * B, and matrix M = (1/A0) * A1 Using iterative method, starting with an arbitray X1 X2 = V - M * X1, then replace X1 = X2. Do these processes iteratively until | X2 - X1 | < tolerance. (Practically you may mix X1 and X2 for better convergence.)
Data file ttdsp2.txt for Eq. A x = b ttdsp2.txt Line 1 : matrix dimension, number of rows and columns. Line 2 -10: matrix elements of A (10 x 10) Line 11 : vector B (1 x 10)
1. read dimension n, m from file ttdsp2.txt 2. build a square matrix amtx, and column vector bvct objects with dimension n (m=n). 3. provide member function in base class dgrMatrix to read a matrix from the file. 4. provide member function in dsqMatrix to extract the diaginal element as an (n x n) square Matrix -- A0 5. substract A0 from amtx to get A1: A1 = amtx - A0 6. inverse the diagonal elements of A0 ==> 1 / A0 7. Multiply A1 with 1/A0: A2 = 1/A0 * A1. 8. Multiply bvct with 1/AO : dvct = 1/A0 * bvct. 9. Start with XX2 = column vector of all element = 1, and a empty XX1 (provide memeber function of this effect.) 10. XX1 = XX XX2 = dvct - A2 * XX repeat step until | XX2 - XX1 | < tolerance (1.0E-6) 13. Check the answer, compare bvct with amtx*XX2. Mission: Make your classes definition work with my main programmain program
This concludes our course. Thank you for your attention.