Difference between revisions of "Directory:Derek Elder/Programs/MyMatrix"
MyWikiBiz, Author Your Legacy — Wednesday October 22, 2025
Jump to navigationJump to searchDerek Elder (talk | contribs) (Correct space) |
Derek Elder (talk | contribs) (Template program added) |
||
| Line 464: | Line 464: | ||
cout<<"\n\nHit enter to exit the program: "<<flush; | cout<<"\n\nHit enter to exit the program: "<<flush; | ||
cin.get();*/ | cin.get();*/ | ||
| + | } | ||
| + | </pre> | ||
| + | |||
| + | =With Templates= | ||
| + | ==MyMatrix.h== | ||
| + | <pre> | ||
| + | #pragma once | ||
| + | #include <iostream> | ||
| + | using namespace std; | ||
| + | |||
| + | template <class T> | ||
| + | class MyMatrix | ||
| + | { | ||
| + | public: | ||
| + | MyMatrix(); | ||
| + | MyMatrix(const MyMatrix<T>& m); | ||
| + | MyMatrix(int rows, int columns); | ||
| + | ~MyMatrix(); | ||
| + | MyMatrix operator+(const MyMatrix<T>& m2) const; | ||
| + | MyMatrix operator-(const MyMatrix<T>& m2) const; | ||
| + | MyMatrix operator=(const MyMatrix<T>& m); | ||
| + | T* operator[](int i); | ||
| + | T* operator[](int i) const; | ||
| + | double getDeterminant(MyMatrix<T>& m); | ||
| + | void Read(istream& is); | ||
| + | void Write(ostream& os) const; | ||
| + | private: | ||
| + | T **m_dpp; | ||
| + | int m_rows; | ||
| + | int m_columns; | ||
| + | }; | ||
| + | template <class T> | ||
| + | istream& operator>>(istream& is, MyMatrix<T>& m); | ||
| + | template <class T> | ||
| + | ostream& operator<<(ostream& os, const MyMatrix<T>& m); | ||
| + | |||
| + | template <class T> | ||
| + | double MyMatrix<T>::getDeterminant(MyMatrix<T>& m) | ||
| + | { | ||
| + | int r, c; | ||
| + | r = m.m_rows; | ||
| + | c = m.m_columns; | ||
| + | |||
| + | double determinant = 0.0; | ||
| + | |||
| + | if(r == c) | ||
| + | { | ||
| + | if(r < 1) | ||
| + | { | ||
| + | cout<<"Less than one row and/or column"; | ||
| + | exit(1); | ||
| + | } | ||
| + | else if(r == 1) | ||
| + | { | ||
| + | return m[0][0]; | ||
| + | } | ||
| + | else if(r == 2) | ||
| + | { | ||
| + | //cout<<"The determinant is: "<<((m[0][0]*m[1][1]) - (m[0][1]*m[1][0])); | ||
| + | determinant = ((m[0][0]*m[1][1]) - (m[1][0]*m[0][1])); | ||
| + | return determinant; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | for(int columns = 0; columns < m.m_columns; columns++) | ||
| + | { | ||
| + | MyMatrix m2((m.m_rows-1),(m.m_columns-1)); | ||
| + | |||
| + | for(int subRows = 1; subRows < m.m_rows; subRows++) | ||
| + | { | ||
| + | int subColumns = 0; | ||
| + | |||
| + | for(int i = 0; i < m.m_columns; i++) | ||
| + | { | ||
| + | if(i != columns) | ||
| + | { | ||
| + | m2[(subRows-1)][subColumns] = m[subRows][i]; | ||
| + | subColumns++; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | determinant = determinant + ((m[0][columns])*(pow(float(-1),float(columns)))*(m2.getDeterminant(m2))); | ||
| + | } | ||
| + | } | ||
| + | return determinant; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | cout<<"Error, the matrix is uneven, cannot determine the matrix, exiting program."; | ||
| + | exit(1); | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T>::MyMatrix() | ||
| + | { | ||
| + | m_rows = 0; | ||
| + | m_columns = 0; | ||
| + | m_dpp = NULL; | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T>::MyMatrix(int rows, int columns) | ||
| + | { | ||
| + | int i, j; | ||
| + | T *dp; | ||
| + | |||
| + | this->m_rows = rows; | ||
| + | this->m_columns = columns; | ||
| + | dp = new T[m_rows*m_columns]; | ||
| + | m_dpp = new T*[m_rows]; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | m_dpp[i] = dp+(i * m_columns); | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | m_dpp[i][j] = 0; | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T>::MyMatrix(const MyMatrix<T>& m) | ||
| + | { | ||
| + | int i, j; | ||
| + | T *dp; | ||
| + | |||
| + | this->m_rows = m.m_rows; | ||
| + | this->m_columns = m.m_columns; | ||
| + | dp = new T[m_rows*m_columns]; | ||
| + | m_dpp = new T*[m_rows]; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | m_dpp[i] = dp+(i * m_columns); | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | m_dpp[i][j] = m.m_dpp[i][j]; | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T>::~MyMatrix() | ||
| + | { | ||
| + | if(m_dpp != NULL) | ||
| + | { | ||
| + | delete [] m_dpp[0]; | ||
| + | delete [] m_dpp; | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T> MyMatrix<T>::operator=(const MyMatrix<T>& m) | ||
| + | { | ||
| + | int i, j; | ||
| + | |||
| + | if(this != &m) | ||
| + | { | ||
| + | if((m.m_rows == m_rows) && (m.m_columns == m_columns)) | ||
| + | { | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | m_dpp[i][j] = m.m_dpp[i][j]; | ||
| + | return *this; | ||
| + | } | ||
| + | if(m_dpp != NULL) | ||
| + | { | ||
| + | delete [] m_dpp[0]; | ||
| + | delete [] m_dpp; | ||
| + | } | ||
| + | |||
| + | T* dp; | ||
| + | this->m_rows = m.m_rows; | ||
| + | this->m_columns = m.m_columns; | ||
| + | dp = new T[m_rows*m_columns]; | ||
| + | m_dpp = new T*[m_rows]; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | m_dpp[i] = dp+(i * m_columns); | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | m_dpp[i][j] = m.m_dpp[i][j]; | ||
| + | } | ||
| + | return *this; | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T> MyMatrix<T>::operator+(const MyMatrix<T>& m2) const | ||
| + | { | ||
| + | int i, j; | ||
| + | |||
| + | if((m2.m_rows != m_rows) || (m2.m_columns != m_columns)) | ||
| + | { | ||
| + | cout<<"Error, different rows and/or columns.\n" | ||
| + | <<"Press enter to exit the program."<<flush; | ||
| + | cin.get(); | ||
| + | cin.get(); | ||
| + | exit(1); | ||
| + | } | ||
| + | MyMatrix sum(m2.m_rows,m2.m_columns); | ||
| + | for(i = 0;i < sum.m_rows;i++) | ||
| + | for(j = 0;j < sum.m_columns;j++) | ||
| + | sum.m_dpp[i][j] = m_dpp[i][j] + m2.m_dpp[i][j]; | ||
| + | return sum; | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T> MyMatrix<T>::operator-(const MyMatrix<T>& m2) const | ||
| + | { | ||
| + | int i, j; | ||
| + | |||
| + | if((m2.m_rows != m_rows) || (m2.m_columns != m_columns)) | ||
| + | { | ||
| + | cout<<"Error, different rows and/or columns.\n" | ||
| + | <<"Press enter to exit the program."<<flush; | ||
| + | cin.get(); | ||
| + | cin.get(); | ||
| + | exit(1); | ||
| + | } | ||
| + | MyMatrix sum(m2.m_rows,m2.m_columns); | ||
| + | for(i = 0;i < m2.m_rows;i++) | ||
| + | for(j = 0;j < m2.m_columns;j++) | ||
| + | sum.m_dpp[i][j] = m_dpp[i][j] - m2.m_dpp[i][j]; | ||
| + | return sum; | ||
| + | } | ||
| + | template <class T> | ||
| + | T* MyMatrix<T>::operator[](int i) | ||
| + | { | ||
| + | if(i >= 0 && i < m_rows) | ||
| + | return m_dpp[i]; | ||
| + | else | ||
| + | { | ||
| + | cout<<"Error, Out of Range. Press enter to exit the program."<<flush; | ||
| + | cin.get(); | ||
| + | cin.get(); | ||
| + | exit(1); | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | T* MyMatrix<T>::operator[](int i) const | ||
| + | { | ||
| + | if(i >= 0 && i < m_rows) | ||
| + | return m_dpp[i]; | ||
| + | else | ||
| + | { | ||
| + | cout<<"Error, Out of Range. Press enter to exit the program."<<flush; | ||
| + | cin.get(); | ||
| + | cin.get(); | ||
| + | exit(1); | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | void MyMatrix<T>::Read(istream& is) | ||
| + | { | ||
| + | int i, j; | ||
| + | int rows, columns; | ||
| + | |||
| + | if(is == cin) | ||
| + | { | ||
| + | cout<<"Enter the number of rows: "<<flush; | ||
| + | cin>>rows; | ||
| + | cout<<"Enter the number of columns: "<<flush; | ||
| + | cin>>columns; | ||
| + | |||
| + | if((rows == m_rows) && (columns == m_columns)) | ||
| + | { | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | { | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | { | ||
| + | cout<<"m["<<i<<"]"<<"["<<j<<"] = "<<flush; | ||
| + | cin>>m_dpp[i][j]; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | if(m_dpp != NULL) | ||
| + | { | ||
| + | delete [] m_dpp[0]; | ||
| + | delete [] m_dpp; | ||
| + | } | ||
| + | |||
| + | m_rows = rows; | ||
| + | m_columns = columns; | ||
| + | |||
| + | T *dp; | ||
| + | dp = new T[m_rows*m_columns]; | ||
| + | m_dpp = new T*[m_rows]; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | m_dpp[i] = dp + (i * m_columns); | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | { | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | { | ||
| + | cout<<"m["<<i<<"]"<<"["<<j<<"] = "<<flush; | ||
| + | cin>>m_dpp[i][j]; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | is>>m_rows; | ||
| + | is>>m_columns; | ||
| + | |||
| + | if(m_dpp != NULL) | ||
| + | { | ||
| + | delete [] m_dpp[0]; | ||
| + | delete [] m_dpp; | ||
| + | } | ||
| + | |||
| + | T *dp; | ||
| + | dp = new T[m_rows*m_columns]; | ||
| + | m_dpp = new T*[m_rows]; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | m_dpp[i] = dp + (i * m_columns); | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | { | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | is>>m_dpp[i][j]; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | void MyMatrix<T>::Write(ostream& os) const | ||
| + | { | ||
| + | int i, j; | ||
| + | |||
| + | if(os == cout) | ||
| + | { | ||
| + | if((m_rows == 0) || (m_columns == 0)) | ||
| + | cout<<"The matrix is empty.\n"; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | { | ||
| + | if(i > 0) | ||
| + | cout<<"\n\n"; | ||
| + | |||
| + | for(j = 0;j < m_columns;j++) | ||
| + | { | ||
| + | cout<<m_dpp[i][j]<<" "; | ||
| + | } | ||
| + | cout<<"\n"; | ||
| + | } | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | { | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | { | ||
| + | os<<m_dpp[i][j]<<"\n"; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | istream& operator>>(istream& is, MyMatrix<T>& m) | ||
| + | { | ||
| + | m.Read(is); | ||
| + | return is; | ||
| + | } | ||
| + | template <class T> | ||
| + | ostream& operator<<(ostream& os, const MyMatrix<T>& m) | ||
| + | { | ||
| + | m.Write(os); | ||
| + | return os; | ||
| + | } | ||
| + | </pre> | ||
| + | ==MyMatrix.cpp== | ||
| + | <pre> | ||
| + | #include <iostream> | ||
| + | #include <cmath> | ||
| + | #include "MyMatrix.h" | ||
| + | using namespace std; | ||
| + | |||
| + | template <class T> | ||
| + | T MyMatrix<T>::getDeterminant(MyMatrix& m) | ||
| + | { | ||
| + | int r, c; | ||
| + | r = m.m_rows; | ||
| + | c = m.m_columns; | ||
| + | |||
| + | T determinant = 0.0; | ||
| + | |||
| + | if(r == c) | ||
| + | { | ||
| + | if(r < 1) | ||
| + | { | ||
| + | cout<<"Less than one row and/or column"; | ||
| + | exit(1); | ||
| + | } | ||
| + | else if(r == 1) | ||
| + | { | ||
| + | return m[0][0]; | ||
| + | } | ||
| + | else if(r == 2) | ||
| + | { | ||
| + | //cout<<"The determinant is: "<<((m[0][0]*m[1][1]) - (m[0][1]*m[1][0])); | ||
| + | determinant = ((m[0][0]*m[1][1]) - (m[1][0]*m[0][1])); | ||
| + | return determinant; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | for(int columns = 0; columns < m.m_columns; columns++) | ||
| + | { | ||
| + | MyMatrix m2((m.m_rows-1),(m.m_columns-1)); | ||
| + | |||
| + | for(int subRows = 1; subRows < m.m_rows; subRows++) | ||
| + | { | ||
| + | int subColumns = 0; | ||
| + | |||
| + | for(int i = 0; i < m.m_columns; i++) | ||
| + | { | ||
| + | if(i != columns) | ||
| + | { | ||
| + | m2[(subRows-1)][subColumns] = m[subRows][i]; | ||
| + | subColumns++; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | determinant = determinant + ((m[0][columns])*(pow(float(-1),float(columns)))*(m2.getDeterminant(m2))); | ||
| + | } | ||
| + | } | ||
| + | return determinant; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | cout<<"Error, the matrix is uneven, cannot determine the matrix, exiting program."; | ||
| + | exit(1); | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T>::MyMatrix() | ||
| + | { | ||
| + | m_rows = 0; | ||
| + | m_columns = 0; | ||
| + | m_dpp = NULL; | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T>::MyMatrix(int rows, int columns) | ||
| + | { | ||
| + | int i, j; | ||
| + | T *dp; | ||
| + | |||
| + | this->m_rows = rows; | ||
| + | this->m_columns = columns; | ||
| + | dp = new T[m_rows*m_columns]; | ||
| + | m_dpp = new T*[m_rows]; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | m_dpp[i] = dp+(i * m_columns); | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | m_dpp[i][j] = 0; | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T>::MyMatrix(const MyMatrix& m) | ||
| + | { | ||
| + | int i, j; | ||
| + | T *dp; | ||
| + | |||
| + | this->m_rows = m.m_rows; | ||
| + | this->m_columns = m.m_columns; | ||
| + | dp = new T[m_rows*m_columns]; | ||
| + | m_dpp = new T*[m_rows]; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | m_dpp[i] = dp+(i * m_columns); | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | m_dpp[i][j] = m.m_dpp[i][j]; | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T>::~MyMatrix() | ||
| + | { | ||
| + | if(m_dpp != NULL) | ||
| + | { | ||
| + | delete [] m_dpp[0]; | ||
| + | delete [] m_dpp; | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T> MyMatrix<T>::operator=(const MyMatrix& m) | ||
| + | { | ||
| + | int i, j; | ||
| + | |||
| + | if(this != &m) | ||
| + | { | ||
| + | if((m.m_rows == m_rows) && (m.m_columns == m_columns)) | ||
| + | { | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | m_dpp[i][j] = m.m_dpp[i][j]; | ||
| + | return *this; | ||
| + | } | ||
| + | if(m_dpp != NULL) | ||
| + | { | ||
| + | delete [] m_dpp[0]; | ||
| + | delete [] m_dpp; | ||
| + | } | ||
| + | |||
| + | T* dp; | ||
| + | this->m_rows = m.m_rows; | ||
| + | this->m_columns = m.m_columns; | ||
| + | dp = new T[m_rows*m_columns]; | ||
| + | m_dpp = new T*[m_rows]; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | m_dpp[i] = dp+(i * m_columns); | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | m_dpp[i][j] = m.m_dpp[i][j]; | ||
| + | } | ||
| + | return *this; | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T> MyMatrix<T>::operator+(const MyMatrix& m2) const | ||
| + | { | ||
| + | int i, j; | ||
| + | |||
| + | if((m2.m_rows != m_rows) || (m2.m_columns != m_columns)) | ||
| + | { | ||
| + | cout<<"Error, different rows and/or columns.\n" | ||
| + | <<"Press enter to exit the program."<<flush; | ||
| + | cin.get(); | ||
| + | cin.get(); | ||
| + | exit(1); | ||
| + | } | ||
| + | MyMatrix sum(m2.m_rows,m2.m_columns); | ||
| + | for(i = 0;i < sum.m_rows;i++) | ||
| + | for(j = 0;j < sum.m_columns;j++) | ||
| + | sum.m_dpp[i][j] = m_dpp[i][j] + m2.m_dpp[i][j]; | ||
| + | return sum; | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T> MyMatrix<T>::operator-(const MyMatrix& m2) const | ||
| + | { | ||
| + | int i, j; | ||
| + | |||
| + | if((m2.m_rows != m_rows) || (m2.m_columns != m_columns)) | ||
| + | { | ||
| + | cout<<"Error, different rows and/or columns.\n" | ||
| + | <<"Press enter to exit the program."<<flush; | ||
| + | cin.get(); | ||
| + | cin.get(); | ||
| + | exit(1); | ||
| + | } | ||
| + | MyMatrix sum(m2.m_rows,m2.m_columns); | ||
| + | for(i = 0;i < m2.m_rows;i++) | ||
| + | for(j = 0;j < m2.m_columns;j++) | ||
| + | sum.m_dpp[i][j] = m_dpp[i][j] - m2.m_dpp[i][j]; | ||
| + | return sum; | ||
| + | } | ||
| + | template <class T> | ||
| + | T* MyMatrix<T>::operator[](int i) | ||
| + | { | ||
| + | if(i >= 0 && i < m_rows) | ||
| + | return m_dpp[i]; | ||
| + | else | ||
| + | { | ||
| + | cout<<"Error, Out of Range. Press enter to exit the program."<<flush; | ||
| + | cin.get(); | ||
| + | cin.get(); | ||
| + | exit(1); | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | T* MyMatrix<T>::operator[](int i) const | ||
| + | { | ||
| + | if(i >= 0 && i < m_rows) | ||
| + | return m_dpp[i]; | ||
| + | else | ||
| + | { | ||
| + | cout<<"Error, Out of Range. Press enter to exit the program."<<flush; | ||
| + | cin.get(); | ||
| + | cin.get(); | ||
| + | exit(1); | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | void MyMatrix<T>::Read(istream& is) | ||
| + | { | ||
| + | int i, j; | ||
| + | int rows, columns; | ||
| + | |||
| + | if(is == cin) | ||
| + | { | ||
| + | cout<<"Enter the number of rows: "<<flush; | ||
| + | cin>>rows; | ||
| + | cout<<"Enter the number of columns: "<<flush; | ||
| + | cin>>columns; | ||
| + | |||
| + | if((rows == m_rows) && (columns == m_columns)) | ||
| + | { | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | { | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | { | ||
| + | cout<<"m["<<i<<"]"<<"["<<j<<"] = "<<flush; | ||
| + | cin>>m_dpp[i][j]; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | if(m_dpp != NULL) | ||
| + | { | ||
| + | delete [] m_dpp[0]; | ||
| + | delete [] m_dpp; | ||
| + | } | ||
| + | |||
| + | m_rows = rows; | ||
| + | m_columns = columns; | ||
| + | |||
| + | T *dp; | ||
| + | dp = new T[m_rows*m_columns]; | ||
| + | m_dpp = new T*[m_rows]; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | m_dpp[i] = dp + (i * m_columns); | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | { | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | { | ||
| + | cout<<"m["<<i<<"]"<<"["<<j<<"] = "<<flush; | ||
| + | cin>>m_dpp[i][j]; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | is>>m_rows; | ||
| + | is>>m_columns; | ||
| + | |||
| + | if(m_dpp != NULL) | ||
| + | { | ||
| + | delete [] m_dpp[0]; | ||
| + | delete [] m_dpp; | ||
| + | } | ||
| + | |||
| + | T *dp; | ||
| + | dp = new T[m_rows*m_columns]; | ||
| + | m_dpp = new T*[m_rows]; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | m_dpp[i] = dp + (i * m_columns); | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | { | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | is>>m_dpp[i][j]; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | void MyMatrix::Write(ostream& os) const | ||
| + | { | ||
| + | int i, j; | ||
| + | |||
| + | if(os == cout) | ||
| + | { | ||
| + | if((m_rows == 0) || (m_columns == 0)) | ||
| + | cout<<"The matrix is empty.\n"; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | { | ||
| + | if(i > 0) | ||
| + | cout<<"\n\n"; | ||
| + | |||
| + | for(j = 0;j < m_columns;j++) | ||
| + | { | ||
| + | cout<<m_dpp[i][j]<<" "; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | { | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | { | ||
| + | os<<m_dpp[i][j]<<"\n"; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | istream& operator>>(istream& is, MyMatrix<T>& m) | ||
| + | { | ||
| + | m.Read(is); | ||
| + | return is; | ||
| + | } | ||
| + | template <class T> | ||
| + | ostream& operator<<(ostream& os, const MyMatrix<T>& m) | ||
| + | { | ||
| + | m.Write(os); | ||
| + | return os; | ||
| + | } | ||
| + | |||
| + | </pre> | ||
| + | ==Main.cpp== | ||
| + | <pre> | ||
| + | #include <iostream> | ||
| + | #include <string> | ||
| + | #include <cmath> | ||
| + | using namespace std; | ||
| + | |||
| + | template <class T> | ||
| + | class MyMatrix | ||
| + | { | ||
| + | public: | ||
| + | MyMatrix(); | ||
| + | MyMatrix(const MyMatrix<T>& m); | ||
| + | MyMatrix(int rows, int columns); | ||
| + | ~MyMatrix(); | ||
| + | MyMatrix operator+(const MyMatrix<T>& m2) const; | ||
| + | MyMatrix operator-(const MyMatrix<T>& m2) const; | ||
| + | MyMatrix operator=(const MyMatrix<T>& m); | ||
| + | T* operator[](int i); | ||
| + | T* operator[](int i) const; | ||
| + | T getDeterminant(MyMatrix<T>& m); | ||
| + | void Read(istream& is); | ||
| + | void Write(ostream& os) const; | ||
| + | private: | ||
| + | T **m_dpp; | ||
| + | int m_rows; | ||
| + | int m_columns; | ||
| + | }; | ||
| + | template <class T> | ||
| + | istream& operator>>(istream& is, MyMatrix<T>& m); | ||
| + | template <class T> | ||
| + | ostream& operator<<(ostream& os, const MyMatrix<T>& m); | ||
| + | void main() | ||
| + | { | ||
| + | |||
| + | MyMatrix<int>m1; | ||
| + | MyMatrix<double>m2; | ||
| + | MyMatrix<float>m3; | ||
| + | m1.getDeterminant(m1); | ||
| + | |||
| + | cout<<"Before entering data in to MyMatrix<int>m1.\n"<<flush; | ||
| + | cin>>m1; | ||
| + | cout<<"\nPrinting out m1.\n"<<flush; | ||
| + | cout<<m1; | ||
| + | MyMatrix<int>m4(m1); | ||
| + | cout<<"\nAfter m4(m1).\n"<<flush; | ||
| + | cout<<m4; | ||
| + | cout<<"\nBefore entering data in to MyMatrix<double>m2.\n"<<flush; | ||
| + | cin>>m2; | ||
| + | cout<<"\nPrinting out m2.\n"<<flush; | ||
| + | cout<<m2; | ||
| + | cout<<"\nBefore entering data in to MyMatrix<float>m3.\n"<<flush; | ||
| + | cin>>m3; | ||
| + | cout<<"\nPrinting out m3.\n"<<flush; | ||
| + | cout<<m3; | ||
| + | MyMatrix<float>m6 = m3; | ||
| + | cout<<"\nAfter m6 = m3.\n"<<flush; | ||
| + | cout<<m6; | ||
| + | cout<<"\nEnd of program reached.\n"<<flush; | ||
| + | cin.get(); | ||
| + | } | ||
| + | |||
| + | template <class T> | ||
| + | T MyMatrix<T>::getDeterminant(MyMatrix<T>& m) | ||
| + | { | ||
| + | int r, c; | ||
| + | r = m.m_rows; | ||
| + | c = m.m_columns; | ||
| + | |||
| + | T determinant/* = 0.0*/; | ||
| + | |||
| + | if(r == c) | ||
| + | { | ||
| + | if(r < 1) | ||
| + | { | ||
| + | cout<<"Less than one row and/or column"; | ||
| + | exit(1); | ||
| + | } | ||
| + | else if(r == 1) | ||
| + | { | ||
| + | return m[0][0]; | ||
| + | } | ||
| + | else if(r == 2) | ||
| + | { | ||
| + | //cout<<"The determinant is: "<<((m[0][0]*m[1][1]) - (m[0][1]*m[1][0])); | ||
| + | determinant = ((m[0][0]*m[1][1]) - (m[1][0]*m[0][1])); | ||
| + | return determinant; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | for(int columns = 0; columns < m.m_columns; columns++) | ||
| + | { | ||
| + | MyMatrix m2((m.m_rows-1),(m.m_columns-1)); | ||
| + | |||
| + | for(int subRows = 1; subRows < m.m_rows; subRows++) | ||
| + | { | ||
| + | int subColumns = 0; | ||
| + | |||
| + | for(int i = 0; i < m.m_columns; i++) | ||
| + | { | ||
| + | if(i != columns) | ||
| + | { | ||
| + | m2[(subRows-1)][subColumns] = m[subRows][i]; | ||
| + | subColumns++; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | determinant = determinant + ((m[0][columns])*(pow(float(-1),float(columns)))*(m2.getDeterminant(m2))); | ||
| + | } | ||
| + | } | ||
| + | return determinant; | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | cout<<"Error, the matrix is uneven, cannot determine the matrix, exiting program."; | ||
| + | exit(1); | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T>::MyMatrix() | ||
| + | { | ||
| + | m_rows = 0; | ||
| + | m_columns = 0; | ||
| + | m_dpp = NULL; | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T>::MyMatrix(int rows, int columns) | ||
| + | { | ||
| + | int i, j; | ||
| + | T *dp; | ||
| + | |||
| + | this->m_rows = rows; | ||
| + | this->m_columns = columns; | ||
| + | dp = new T[m_rows*m_columns]; | ||
| + | m_dpp = new T*[m_rows]; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | m_dpp[i] = dp+(i * m_columns); | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | m_dpp[i][j] = 0; | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T>::MyMatrix(const MyMatrix<T>& m) | ||
| + | { | ||
| + | int i, j; | ||
| + | T *dp; | ||
| + | |||
| + | this->m_rows = m.m_rows; | ||
| + | this->m_columns = m.m_columns; | ||
| + | dp = new T[m_rows*m_columns]; | ||
| + | m_dpp = new T*[m_rows]; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | m_dpp[i] = dp+(i * m_columns); | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | m_dpp[i][j] = m.m_dpp[i][j]; | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T>::~MyMatrix() | ||
| + | { | ||
| + | if(m_dpp != NULL) | ||
| + | { | ||
| + | delete [] m_dpp[0]; | ||
| + | delete [] m_dpp; | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T> MyMatrix<T>::operator=(const MyMatrix<T>& m) | ||
| + | { | ||
| + | int i, j; | ||
| + | |||
| + | if(this != &m) | ||
| + | { | ||
| + | if((m.m_rows == m_rows) && (m.m_columns == m_columns)) | ||
| + | { | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | m_dpp[i][j] = m.m_dpp[i][j]; | ||
| + | return *this; | ||
| + | } | ||
| + | if(m_dpp != NULL) | ||
| + | { | ||
| + | delete [] m_dpp[0]; | ||
| + | delete [] m_dpp; | ||
| + | } | ||
| + | |||
| + | T* dp; | ||
| + | this->m_rows = m.m_rows; | ||
| + | this->m_columns = m.m_columns; | ||
| + | dp = new T[m_rows*m_columns]; | ||
| + | m_dpp = new T*[m_rows]; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | m_dpp[i] = dp+(i * m_columns); | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | m_dpp[i][j] = m.m_dpp[i][j]; | ||
| + | } | ||
| + | return *this; | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T> MyMatrix<T>::operator+(const MyMatrix<T>& m2) const | ||
| + | { | ||
| + | int i, j; | ||
| + | |||
| + | if((m2.m_rows != m_rows) || (m2.m_columns != m_columns)) | ||
| + | { | ||
| + | cout<<"Error, different rows and/or columns.\n" | ||
| + | <<"Press enter to exit the program."<<flush; | ||
| + | cin.get(); | ||
| + | cin.get(); | ||
| + | exit(1); | ||
| + | } | ||
| + | MyMatrix sum(m2.m_rows,m2.m_columns); | ||
| + | for(i = 0;i < sum.m_rows;i++) | ||
| + | for(j = 0;j < sum.m_columns;j++) | ||
| + | sum.m_dpp[i][j] = m_dpp[i][j] + m2.m_dpp[i][j]; | ||
| + | return sum; | ||
| + | } | ||
| + | template <class T> | ||
| + | MyMatrix<T> MyMatrix<T>::operator-(const MyMatrix<T>& m2) const | ||
| + | { | ||
| + | int i, j; | ||
| + | |||
| + | if((m2.m_rows != m_rows) || (m2.m_columns != m_columns)) | ||
| + | { | ||
| + | cout<<"Error, different rows and/or columns.\n" | ||
| + | <<"Press enter to exit the program."<<flush; | ||
| + | cin.get(); | ||
| + | cin.get(); | ||
| + | exit(1); | ||
| + | } | ||
| + | MyMatrix difference(m2.m_rows,m2.m_columns); | ||
| + | for(i = 0;i < m2.m_rows;i++) | ||
| + | for(j = 0;j < m2.m_columns;j++) | ||
| + | difference.m_dpp[i][j] = m_dpp[i][j] - m2.m_dpp[i][j]; | ||
| + | return difference; | ||
| + | } | ||
| + | template <class T> | ||
| + | T* MyMatrix<T>::operator[](int i) | ||
| + | { | ||
| + | if(i >= 0 && i < m_rows) | ||
| + | return m_dpp[i]; | ||
| + | else | ||
| + | { | ||
| + | cout<<"Error, Out of Range. Press enter to exit the program."<<flush; | ||
| + | cin.get(); | ||
| + | cin.get(); | ||
| + | exit(1); | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | T* MyMatrix<T>::operator[](int i) const | ||
| + | { | ||
| + | if(i >= 0 && i < m_rows) | ||
| + | return m_dpp[i]; | ||
| + | else | ||
| + | { | ||
| + | cout<<"Error, Out of Range. Press enter to exit the program."<<flush; | ||
| + | cin.get(); | ||
| + | cin.get(); | ||
| + | exit(1); | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | void MyMatrix<T>::Read(istream& is) | ||
| + | { | ||
| + | int i, j; | ||
| + | int rows, columns; | ||
| + | |||
| + | if(is == cin) | ||
| + | { | ||
| + | cout<<"Enter the number of rows: "<<flush; | ||
| + | cin>>rows; | ||
| + | cout<<"Enter the number of columns: "<<flush; | ||
| + | cin>>columns; | ||
| + | |||
| + | if((rows == m_rows) && (columns == m_columns)) | ||
| + | { | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | { | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | { | ||
| + | cout<<"m["<<i<<"]"<<"["<<j<<"] = "<<flush; | ||
| + | cin>>m_dpp[i][j]; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | if(m_dpp != NULL) | ||
| + | { | ||
| + | delete [] m_dpp[0]; | ||
| + | delete [] m_dpp; | ||
| + | } | ||
| + | |||
| + | m_rows = rows; | ||
| + | m_columns = columns; | ||
| + | |||
| + | T *dp; | ||
| + | dp = new T[m_rows*m_columns]; | ||
| + | m_dpp = new T*[m_rows]; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | m_dpp[i] = dp + (i * m_columns); | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | { | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | { | ||
| + | cout<<"m["<<i<<"]"<<"["<<j<<"] = "<<flush; | ||
| + | cin>>m_dpp[i][j]; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | is>>m_rows; | ||
| + | is>>m_columns; | ||
| + | |||
| + | if(m_dpp != NULL) | ||
| + | { | ||
| + | delete [] m_dpp[0]; | ||
| + | delete [] m_dpp; | ||
| + | } | ||
| + | |||
| + | T *dp; | ||
| + | dp = new T[m_rows*m_columns]; | ||
| + | m_dpp = new T*[m_rows]; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | m_dpp[i] = dp + (i * m_columns); | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | { | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | is>>m_dpp[i][j]; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | void MyMatrix<T>::Write(ostream& os) const | ||
| + | { | ||
| + | int i, j; | ||
| + | |||
| + | if(os == cout) | ||
| + | { | ||
| + | if((m_rows == 0) || (m_columns == 0)) | ||
| + | cout<<"The matrix is empty.\n"; | ||
| + | |||
| + | for(i = 0;i < m_rows;i++) | ||
| + | { | ||
| + | if(i > 0) | ||
| + | cout<<"\n\n"; | ||
| + | |||
| + | for(j = 0;j < m_columns;j++) | ||
| + | { | ||
| + | cout<<m_dpp[i][j]<<" "; | ||
| + | } | ||
| + | cout<<"\n"; | ||
| + | } | ||
| + | } | ||
| + | else | ||
| + | { | ||
| + | for(i = 0;i < m_rows;i++) | ||
| + | { | ||
| + | for(j = 0;j < m_columns;j++) | ||
| + | { | ||
| + | os<<m_dpp[i][j]<<"\n"; | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | } | ||
| + | template <class T> | ||
| + | istream& operator>>(istream& is, MyMatrix<T>& m) | ||
| + | { | ||
| + | m.Read(is); | ||
| + | return is; | ||
| + | } | ||
| + | template <class T> | ||
| + | ostream& operator<<(ostream& os, const MyMatrix<T>& m) | ||
| + | { | ||
| + | m.Write(os); | ||
| + | return os; | ||
} | } | ||
</pre> | </pre> | ||
Latest revision as of 23:10, 19 February 2011
MyMatrix.h
#pragma once
#include <iostream>
using namespace std;
class MyMatrix
{
public:
MyMatrix();
MyMatrix(const MyMatrix& m);
MyMatrix(int rows, int columns);
~MyMatrix();
MyMatrix operator+(const MyMatrix& m2) const;
MyMatrix operator-(const MyMatrix& m2) const;
MyMatrix operator=(const MyMatrix& m);
double* operator[](int i);
double* operator[](int i) const;
double getDeterminant(MyMatrix& m);
void Read(istream& is);
void Write(ostream& os) const;
private:
double **m_dpp;
int m_rows;
int m_columns;
};
istream& operator>>(istream& is, MyMatrix& m);
ostream& operator<<(ostream& os, const MyMatrix& m);
MyMatrix.cpp
#include <iostream>
#include <cmath>
#include "MyMatrix.h"
using namespace std;
double MyMatrix::getDeterminant(MyMatrix& m)
{
int r, c;
r = m.m_rows;
c = m.m_columns;
double determinant = 0.0;
if(r == c)
{
if(r < 1)
{
cout<<"Less than one row and/or column";
exit(1);
}
else if(r == 1)
{
return m[0][0];
}
else if(r == 2)
{
//cout<<"The determinant is: "<<((m[0][0]*m[1][1]) - (m[0][1]*m[1][0]));
determinant = ((m[0][0]*m[1][1]) - (m[1][0]*m[0][1]));
return determinant;
}
else
{
for(int columns = 0; columns < m.m_columns; columns++)
{
MyMatrix m2((m.m_rows-1),(m.m_columns-1));
for(int subRows = 1; subRows < m.m_rows; subRows++)
{
int subColumns = 0;
for(int i = 0; i < m.m_columns; i++)
{
if(i != columns)
{
m2[(subRows-1)][subColumns] = m[subRows][i];
subColumns++;
}
}
}
determinant = determinant + ((m[0][columns])*(pow(float(-1),float(columns)))*(m2.getDeterminant(m2)));
}
}
return determinant;
}
else
{
cout<<"Error, the matrix is uneven, cannot determine the matrix, exiting program.";
exit(1);
}
}
MyMatrix::MyMatrix()
{
m_rows = 0;
m_columns = 0;
m_dpp = NULL;
}
MyMatrix::MyMatrix(int rows, int columns)
{
int i, j;
double *dp;
this->m_rows = rows;
this->m_columns = columns;
dp = new double[m_rows*m_columns];
m_dpp = new double*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp+(i * m_columns);
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = 0;
}
MyMatrix::MyMatrix(const MyMatrix& m)
{
int i, j;
double *dp;
this->m_rows = m.m_rows;
this->m_columns = m.m_columns;
dp = new double[m_rows*m_columns]; //Real -> m_rows*m_columns != 0
m_dpp = new double*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp+(i * m_columns);
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = m.m_dpp[i][j];
}
MyMatrix::~MyMatrix()
{
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
}
MyMatrix MyMatrix::operator=(const MyMatrix& m)
{
int i, j;
if(this != &m)
{
if((m.m_rows == m_rows) && (m.m_columns == m_columns))
{
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = m.m_dpp[i][j];
return *this;
}
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
double* dp;
this->m_rows = m.m_rows;
this->m_columns = m.m_columns;
dp = new double[m_rows*m_columns];
m_dpp = new double*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp+(i * m_columns);
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = m.m_dpp[i][j];
}
return *this;
}
double* MyMatrix::operator[](int i)
{
if(i >= 0 && i < m_rows)
return m_dpp[i];
else
{
cout<<"Error, Out of Range. Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
}
double* MyMatrix::operator[](int i) const
{
if(i >= 0 && i < m_rows)
return m_dpp[i];
else
{
cout<<"Error, Out of Range. Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
}
MyMatrix MyMatrix::operator+(const MyMatrix& m2) const
{
int i, j;
if((m2.m_rows != m_rows) || (m2.m_columns != m_columns))
{
cout<<"Error, different rows and/or columns.\n"
<<"Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
MyMatrix sum(m2.m_rows,m2.m_columns);
for(i = 0;i < sum.m_rows;i++)
for(j = 0;j < sum.m_columns;j++)
sum.m_dpp[i][j] = m_dpp[i][j] + m2.m_dpp[i][j];
return sum;
}
MyMatrix MyMatrix::operator-(const MyMatrix& m2) const
{
int i, j;
if((m2.m_rows != m_rows) || (m2.m_columns != m_columns))
{
cout<<"Error, different rows and/or columns.\n"
<<"Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
MyMatrix sum(m2.m_rows,m2.m_columns);
for(i = 0;i < m2.m_rows;i++)
for(j = 0;j < m2.m_columns;j++)
sum.m_dpp[i][j] = m_dpp[i][j] - m2.m_dpp[i][j];
return sum;
}
void MyMatrix::Read(istream& is)
{
int i, j;
int rows, columns;
if(is == cin)
{
cout<<"Enter the number of rows: "<<flush;
cin>>rows;
cout<<"Enter the number of columns: "<<flush;
cin>>columns;
if((rows == m_rows) && (columns == m_columns))
{
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
{
cout<<"m["<<i<<"]"<<"["<<j<<"] = "<<flush;
cin>>m_dpp[i][j];
}
}
}
else
{
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
m_rows = rows;
m_columns = columns;
double *dp;
dp = new double[m_rows*m_columns];
m_dpp = new double*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp + (i * m_columns);
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
{
cout<<"m["<<i<<"]"<<"["<<j<<"] = "<<flush;
cin>>m_dpp[i][j];
}
}
}
}
else
{
is>>m_rows;
is>>m_columns;
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
double *dp;
dp = new double[m_rows*m_columns];
m_dpp = new double*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp + (i * m_columns);
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
is>>m_dpp[i][j];
}
}
}
void MyMatrix::Write(ostream& os) const
{
int i, j;
if(os == cout)
{
if((m_rows == 0) || (m_columns == 0))
cout<<"The matrix is empty.\n";
for(i = 0;i < m_rows;i++)
{
if(i > 0)
cout<<"\n\n";
for(j = 0;j < m_columns;j++)
{
cout<<m_dpp[i][j]<<" ";
}
}
}
else
{
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
{
os<<m_dpp[i][j]<<"\n";
}
}
}
}
istream& operator>>(istream& is, MyMatrix& m)
{
m.Read(is);
return is;
}
ostream& operator<<(ostream& os, const MyMatrix& m)
{
m.Write(os);
return os;
}
Main.cpp
#include <iostream>
#include <string>
#include "MyMatrix.h"
using namespace std;
void main()
{
int rows,i,j;
double cr;
//MyMatrix m1, m2(2,3);
cout<<"How many equations would you like to solve? "<<flush;
cin>>rows;
MyMatrix m3(rows,rows); //Input matrix
MyMatrix m4(rows,1); //Answer matrix
for(i = 0;i < rows;i++)
{
for(j = 0;j < rows;j++)
{
cout<<"Enter the coefficent of row "<<(i + 1)
<<", column "<<(j + 1)<<": ";
cin>>m3[i][j];
}
cout<<"Enter what the row equates to: ";
cin>>m4[i][0];
}
cout<<"The determinant is: "<<m3.getDeterminant(m3)<<"\n";
MyMatrix m5(m3); //D Matrix
MyMatrix m6(1,rows); //Variable matrix
for(j = 0; j < rows;j++)
{
cr = 0;
for(i = 0;i < rows;i++)
{
m5[i][j] = m4[i][0];
}
cr = ((m5.getDeterminant(m5))/(m3.getDeterminant(m3)));
m5 = m3;
m6[0][j] = cr;
cout<<"cr"<<(j+1)<<" = "<<cr<<endl;
}
cout<<"Checking phase"<<'\n';
double var;
for(i = 0;i < rows;i++)
{
var = 0;
for(j = 0;j < rows;j++)
{
var += (m6[0][j] * m5[i][j]);
cout<<m5[i][j]<<" * "<<m6[0][j];
if(j != rows - 1)
{
cout<<" + ";
}
else
{
cout<<" = ";
}
}
cout<<var<<endl;
}
cout<<"\nHit enter to exit the program."<<endl;
/*cout<<"After:\n"
<<"MyMatrix m1, m2(2,3), m3;\n"
<<"m1:\n"<<m1
<<"\nm2:\n"<<m2
<<"\nm3:\n"<<m3;
cout<<"\n\nEnter the data for m3:\n"<<flush;
cin>>m3;
cout<<"\nThe matrix you entered follows:\n"<<m3;
cout<<"\nHit enter to continue: "<<flush;
cin.get();
cin.get();
cout<<"\nm3[0][0] = " << m3[0][0] << '\n';
m3[0][0] = 29.999;
cout<<"\nAfter:\n m3[0][0] = 29.999;\nm3 follows:\n"<<m3;
cout<<"\nHit enter to continue: "<<flush;
cin.get();
cout<<"\n\nEnter the data for m2:\n"<<flush;
cin>>m2;
cout<<"The matrix you entered follows:\n"<<m2;
cout<<"\nHit enter to continue: "<<flush;
cin.get();
m1 = m2 + m3;
cout<<"\n\nAfter:\n m1 = m2 + m3;\nm1 follows:\n"<<m1;
cout<<"\nHit enter to continue: "<<flush;
cin.get();
m1 = m2 - m3;
cout<<"\n\nAfter:\n m1 = m2 - m3;\nm1 follows:\n"<<m1;
cout<<"\nHit enter to continue: "<<flush;
cin.get();
m1 = m3;
cout<<"\n\nAfter:\n m1 = m3;\nm1 follows:\n"<<m1;
cout<<"\nHit enter to continue: "<<flush;
cin.get();
m1[0][0] = -999.876;
cout<<"\n\nAfter:\n m1[0][0] = -999.876;\nm1 follows:\n"<<m1
<<"\n\nm3 follows:\n" <<m3<<"\n\nIs this what you expected?";
cout<<"\n\nHit enter to exit the program: "<<flush;
cin.get();*/
}
With Templates
MyMatrix.h
#pragma once
#include <iostream>
using namespace std;
template <class T>
class MyMatrix
{
public:
MyMatrix();
MyMatrix(const MyMatrix<T>& m);
MyMatrix(int rows, int columns);
~MyMatrix();
MyMatrix operator+(const MyMatrix<T>& m2) const;
MyMatrix operator-(const MyMatrix<T>& m2) const;
MyMatrix operator=(const MyMatrix<T>& m);
T* operator[](int i);
T* operator[](int i) const;
double getDeterminant(MyMatrix<T>& m);
void Read(istream& is);
void Write(ostream& os) const;
private:
T **m_dpp;
int m_rows;
int m_columns;
};
template <class T>
istream& operator>>(istream& is, MyMatrix<T>& m);
template <class T>
ostream& operator<<(ostream& os, const MyMatrix<T>& m);
template <class T>
double MyMatrix<T>::getDeterminant(MyMatrix<T>& m)
{
int r, c;
r = m.m_rows;
c = m.m_columns;
double determinant = 0.0;
if(r == c)
{
if(r < 1)
{
cout<<"Less than one row and/or column";
exit(1);
}
else if(r == 1)
{
return m[0][0];
}
else if(r == 2)
{
//cout<<"The determinant is: "<<((m[0][0]*m[1][1]) - (m[0][1]*m[1][0]));
determinant = ((m[0][0]*m[1][1]) - (m[1][0]*m[0][1]));
return determinant;
}
else
{
for(int columns = 0; columns < m.m_columns; columns++)
{
MyMatrix m2((m.m_rows-1),(m.m_columns-1));
for(int subRows = 1; subRows < m.m_rows; subRows++)
{
int subColumns = 0;
for(int i = 0; i < m.m_columns; i++)
{
if(i != columns)
{
m2[(subRows-1)][subColumns] = m[subRows][i];
subColumns++;
}
}
}
determinant = determinant + ((m[0][columns])*(pow(float(-1),float(columns)))*(m2.getDeterminant(m2)));
}
}
return determinant;
}
else
{
cout<<"Error, the matrix is uneven, cannot determine the matrix, exiting program.";
exit(1);
}
}
template <class T>
MyMatrix<T>::MyMatrix()
{
m_rows = 0;
m_columns = 0;
m_dpp = NULL;
}
template <class T>
MyMatrix<T>::MyMatrix(int rows, int columns)
{
int i, j;
T *dp;
this->m_rows = rows;
this->m_columns = columns;
dp = new T[m_rows*m_columns];
m_dpp = new T*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp+(i * m_columns);
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = 0;
}
template <class T>
MyMatrix<T>::MyMatrix(const MyMatrix<T>& m)
{
int i, j;
T *dp;
this->m_rows = m.m_rows;
this->m_columns = m.m_columns;
dp = new T[m_rows*m_columns];
m_dpp = new T*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp+(i * m_columns);
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = m.m_dpp[i][j];
}
template <class T>
MyMatrix<T>::~MyMatrix()
{
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
}
template <class T>
MyMatrix<T> MyMatrix<T>::operator=(const MyMatrix<T>& m)
{
int i, j;
if(this != &m)
{
if((m.m_rows == m_rows) && (m.m_columns == m_columns))
{
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = m.m_dpp[i][j];
return *this;
}
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
T* dp;
this->m_rows = m.m_rows;
this->m_columns = m.m_columns;
dp = new T[m_rows*m_columns];
m_dpp = new T*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp+(i * m_columns);
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = m.m_dpp[i][j];
}
return *this;
}
template <class T>
MyMatrix<T> MyMatrix<T>::operator+(const MyMatrix<T>& m2) const
{
int i, j;
if((m2.m_rows != m_rows) || (m2.m_columns != m_columns))
{
cout<<"Error, different rows and/or columns.\n"
<<"Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
MyMatrix sum(m2.m_rows,m2.m_columns);
for(i = 0;i < sum.m_rows;i++)
for(j = 0;j < sum.m_columns;j++)
sum.m_dpp[i][j] = m_dpp[i][j] + m2.m_dpp[i][j];
return sum;
}
template <class T>
MyMatrix<T> MyMatrix<T>::operator-(const MyMatrix<T>& m2) const
{
int i, j;
if((m2.m_rows != m_rows) || (m2.m_columns != m_columns))
{
cout<<"Error, different rows and/or columns.\n"
<<"Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
MyMatrix sum(m2.m_rows,m2.m_columns);
for(i = 0;i < m2.m_rows;i++)
for(j = 0;j < m2.m_columns;j++)
sum.m_dpp[i][j] = m_dpp[i][j] - m2.m_dpp[i][j];
return sum;
}
template <class T>
T* MyMatrix<T>::operator[](int i)
{
if(i >= 0 && i < m_rows)
return m_dpp[i];
else
{
cout<<"Error, Out of Range. Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
}
template <class T>
T* MyMatrix<T>::operator[](int i) const
{
if(i >= 0 && i < m_rows)
return m_dpp[i];
else
{
cout<<"Error, Out of Range. Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
}
template <class T>
void MyMatrix<T>::Read(istream& is)
{
int i, j;
int rows, columns;
if(is == cin)
{
cout<<"Enter the number of rows: "<<flush;
cin>>rows;
cout<<"Enter the number of columns: "<<flush;
cin>>columns;
if((rows == m_rows) && (columns == m_columns))
{
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
{
cout<<"m["<<i<<"]"<<"["<<j<<"] = "<<flush;
cin>>m_dpp[i][j];
}
}
}
else
{
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
m_rows = rows;
m_columns = columns;
T *dp;
dp = new T[m_rows*m_columns];
m_dpp = new T*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp + (i * m_columns);
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
{
cout<<"m["<<i<<"]"<<"["<<j<<"] = "<<flush;
cin>>m_dpp[i][j];
}
}
}
}
else
{
is>>m_rows;
is>>m_columns;
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
T *dp;
dp = new T[m_rows*m_columns];
m_dpp = new T*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp + (i * m_columns);
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
is>>m_dpp[i][j];
}
}
}
template <class T>
void MyMatrix<T>::Write(ostream& os) const
{
int i, j;
if(os == cout)
{
if((m_rows == 0) || (m_columns == 0))
cout<<"The matrix is empty.\n";
for(i = 0;i < m_rows;i++)
{
if(i > 0)
cout<<"\n\n";
for(j = 0;j < m_columns;j++)
{
cout<<m_dpp[i][j]<<" ";
}
cout<<"\n";
}
}
else
{
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
{
os<<m_dpp[i][j]<<"\n";
}
}
}
}
template <class T>
istream& operator>>(istream& is, MyMatrix<T>& m)
{
m.Read(is);
return is;
}
template <class T>
ostream& operator<<(ostream& os, const MyMatrix<T>& m)
{
m.Write(os);
return os;
}
MyMatrix.cpp
#include <iostream>
#include <cmath>
#include "MyMatrix.h"
using namespace std;
template <class T>
T MyMatrix<T>::getDeterminant(MyMatrix& m)
{
int r, c;
r = m.m_rows;
c = m.m_columns;
T determinant = 0.0;
if(r == c)
{
if(r < 1)
{
cout<<"Less than one row and/or column";
exit(1);
}
else if(r == 1)
{
return m[0][0];
}
else if(r == 2)
{
//cout<<"The determinant is: "<<((m[0][0]*m[1][1]) - (m[0][1]*m[1][0]));
determinant = ((m[0][0]*m[1][1]) - (m[1][0]*m[0][1]));
return determinant;
}
else
{
for(int columns = 0; columns < m.m_columns; columns++)
{
MyMatrix m2((m.m_rows-1),(m.m_columns-1));
for(int subRows = 1; subRows < m.m_rows; subRows++)
{
int subColumns = 0;
for(int i = 0; i < m.m_columns; i++)
{
if(i != columns)
{
m2[(subRows-1)][subColumns] = m[subRows][i];
subColumns++;
}
}
}
determinant = determinant + ((m[0][columns])*(pow(float(-1),float(columns)))*(m2.getDeterminant(m2)));
}
}
return determinant;
}
else
{
cout<<"Error, the matrix is uneven, cannot determine the matrix, exiting program.";
exit(1);
}
}
template <class T>
MyMatrix<T>::MyMatrix()
{
m_rows = 0;
m_columns = 0;
m_dpp = NULL;
}
template <class T>
MyMatrix<T>::MyMatrix(int rows, int columns)
{
int i, j;
T *dp;
this->m_rows = rows;
this->m_columns = columns;
dp = new T[m_rows*m_columns];
m_dpp = new T*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp+(i * m_columns);
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = 0;
}
template <class T>
MyMatrix<T>::MyMatrix(const MyMatrix& m)
{
int i, j;
T *dp;
this->m_rows = m.m_rows;
this->m_columns = m.m_columns;
dp = new T[m_rows*m_columns];
m_dpp = new T*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp+(i * m_columns);
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = m.m_dpp[i][j];
}
template <class T>
MyMatrix<T>::~MyMatrix()
{
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
}
template <class T>
MyMatrix<T> MyMatrix<T>::operator=(const MyMatrix& m)
{
int i, j;
if(this != &m)
{
if((m.m_rows == m_rows) && (m.m_columns == m_columns))
{
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = m.m_dpp[i][j];
return *this;
}
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
T* dp;
this->m_rows = m.m_rows;
this->m_columns = m.m_columns;
dp = new T[m_rows*m_columns];
m_dpp = new T*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp+(i * m_columns);
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = m.m_dpp[i][j];
}
return *this;
}
template <class T>
MyMatrix<T> MyMatrix<T>::operator+(const MyMatrix& m2) const
{
int i, j;
if((m2.m_rows != m_rows) || (m2.m_columns != m_columns))
{
cout<<"Error, different rows and/or columns.\n"
<<"Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
MyMatrix sum(m2.m_rows,m2.m_columns);
for(i = 0;i < sum.m_rows;i++)
for(j = 0;j < sum.m_columns;j++)
sum.m_dpp[i][j] = m_dpp[i][j] + m2.m_dpp[i][j];
return sum;
}
template <class T>
MyMatrix<T> MyMatrix<T>::operator-(const MyMatrix& m2) const
{
int i, j;
if((m2.m_rows != m_rows) || (m2.m_columns != m_columns))
{
cout<<"Error, different rows and/or columns.\n"
<<"Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
MyMatrix sum(m2.m_rows,m2.m_columns);
for(i = 0;i < m2.m_rows;i++)
for(j = 0;j < m2.m_columns;j++)
sum.m_dpp[i][j] = m_dpp[i][j] - m2.m_dpp[i][j];
return sum;
}
template <class T>
T* MyMatrix<T>::operator[](int i)
{
if(i >= 0 && i < m_rows)
return m_dpp[i];
else
{
cout<<"Error, Out of Range. Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
}
template <class T>
T* MyMatrix<T>::operator[](int i) const
{
if(i >= 0 && i < m_rows)
return m_dpp[i];
else
{
cout<<"Error, Out of Range. Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
}
template <class T>
void MyMatrix<T>::Read(istream& is)
{
int i, j;
int rows, columns;
if(is == cin)
{
cout<<"Enter the number of rows: "<<flush;
cin>>rows;
cout<<"Enter the number of columns: "<<flush;
cin>>columns;
if((rows == m_rows) && (columns == m_columns))
{
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
{
cout<<"m["<<i<<"]"<<"["<<j<<"] = "<<flush;
cin>>m_dpp[i][j];
}
}
}
else
{
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
m_rows = rows;
m_columns = columns;
T *dp;
dp = new T[m_rows*m_columns];
m_dpp = new T*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp + (i * m_columns);
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
{
cout<<"m["<<i<<"]"<<"["<<j<<"] = "<<flush;
cin>>m_dpp[i][j];
}
}
}
}
else
{
is>>m_rows;
is>>m_columns;
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
T *dp;
dp = new T[m_rows*m_columns];
m_dpp = new T*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp + (i * m_columns);
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
is>>m_dpp[i][j];
}
}
}
template <class T>
void MyMatrix::Write(ostream& os) const
{
int i, j;
if(os == cout)
{
if((m_rows == 0) || (m_columns == 0))
cout<<"The matrix is empty.\n";
for(i = 0;i < m_rows;i++)
{
if(i > 0)
cout<<"\n\n";
for(j = 0;j < m_columns;j++)
{
cout<<m_dpp[i][j]<<" ";
}
}
}
else
{
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
{
os<<m_dpp[i][j]<<"\n";
}
}
}
}
template <class T>
istream& operator>>(istream& is, MyMatrix<T>& m)
{
m.Read(is);
return is;
}
template <class T>
ostream& operator<<(ostream& os, const MyMatrix<T>& m)
{
m.Write(os);
return os;
}
Main.cpp
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
template <class T>
class MyMatrix
{
public:
MyMatrix();
MyMatrix(const MyMatrix<T>& m);
MyMatrix(int rows, int columns);
~MyMatrix();
MyMatrix operator+(const MyMatrix<T>& m2) const;
MyMatrix operator-(const MyMatrix<T>& m2) const;
MyMatrix operator=(const MyMatrix<T>& m);
T* operator[](int i);
T* operator[](int i) const;
T getDeterminant(MyMatrix<T>& m);
void Read(istream& is);
void Write(ostream& os) const;
private:
T **m_dpp;
int m_rows;
int m_columns;
};
template <class T>
istream& operator>>(istream& is, MyMatrix<T>& m);
template <class T>
ostream& operator<<(ostream& os, const MyMatrix<T>& m);
void main()
{
MyMatrix<int>m1;
MyMatrix<double>m2;
MyMatrix<float>m3;
m1.getDeterminant(m1);
cout<<"Before entering data in to MyMatrix<int>m1.\n"<<flush;
cin>>m1;
cout<<"\nPrinting out m1.\n"<<flush;
cout<<m1;
MyMatrix<int>m4(m1);
cout<<"\nAfter m4(m1).\n"<<flush;
cout<<m4;
cout<<"\nBefore entering data in to MyMatrix<double>m2.\n"<<flush;
cin>>m2;
cout<<"\nPrinting out m2.\n"<<flush;
cout<<m2;
cout<<"\nBefore entering data in to MyMatrix<float>m3.\n"<<flush;
cin>>m3;
cout<<"\nPrinting out m3.\n"<<flush;
cout<<m3;
MyMatrix<float>m6 = m3;
cout<<"\nAfter m6 = m3.\n"<<flush;
cout<<m6;
cout<<"\nEnd of program reached.\n"<<flush;
cin.get();
}
template <class T>
T MyMatrix<T>::getDeterminant(MyMatrix<T>& m)
{
int r, c;
r = m.m_rows;
c = m.m_columns;
T determinant/* = 0.0*/;
if(r == c)
{
if(r < 1)
{
cout<<"Less than one row and/or column";
exit(1);
}
else if(r == 1)
{
return m[0][0];
}
else if(r == 2)
{
//cout<<"The determinant is: "<<((m[0][0]*m[1][1]) - (m[0][1]*m[1][0]));
determinant = ((m[0][0]*m[1][1]) - (m[1][0]*m[0][1]));
return determinant;
}
else
{
for(int columns = 0; columns < m.m_columns; columns++)
{
MyMatrix m2((m.m_rows-1),(m.m_columns-1));
for(int subRows = 1; subRows < m.m_rows; subRows++)
{
int subColumns = 0;
for(int i = 0; i < m.m_columns; i++)
{
if(i != columns)
{
m2[(subRows-1)][subColumns] = m[subRows][i];
subColumns++;
}
}
}
determinant = determinant + ((m[0][columns])*(pow(float(-1),float(columns)))*(m2.getDeterminant(m2)));
}
}
return determinant;
}
else
{
cout<<"Error, the matrix is uneven, cannot determine the matrix, exiting program.";
exit(1);
}
}
template <class T>
MyMatrix<T>::MyMatrix()
{
m_rows = 0;
m_columns = 0;
m_dpp = NULL;
}
template <class T>
MyMatrix<T>::MyMatrix(int rows, int columns)
{
int i, j;
T *dp;
this->m_rows = rows;
this->m_columns = columns;
dp = new T[m_rows*m_columns];
m_dpp = new T*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp+(i * m_columns);
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = 0;
}
template <class T>
MyMatrix<T>::MyMatrix(const MyMatrix<T>& m)
{
int i, j;
T *dp;
this->m_rows = m.m_rows;
this->m_columns = m.m_columns;
dp = new T[m_rows*m_columns];
m_dpp = new T*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp+(i * m_columns);
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = m.m_dpp[i][j];
}
template <class T>
MyMatrix<T>::~MyMatrix()
{
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
}
template <class T>
MyMatrix<T> MyMatrix<T>::operator=(const MyMatrix<T>& m)
{
int i, j;
if(this != &m)
{
if((m.m_rows == m_rows) && (m.m_columns == m_columns))
{
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = m.m_dpp[i][j];
return *this;
}
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
T* dp;
this->m_rows = m.m_rows;
this->m_columns = m.m_columns;
dp = new T[m_rows*m_columns];
m_dpp = new T*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp+(i * m_columns);
for(i = 0;i < m_rows;i++)
for(j = 0;j < m_columns;j++)
m_dpp[i][j] = m.m_dpp[i][j];
}
return *this;
}
template <class T>
MyMatrix<T> MyMatrix<T>::operator+(const MyMatrix<T>& m2) const
{
int i, j;
if((m2.m_rows != m_rows) || (m2.m_columns != m_columns))
{
cout<<"Error, different rows and/or columns.\n"
<<"Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
MyMatrix sum(m2.m_rows,m2.m_columns);
for(i = 0;i < sum.m_rows;i++)
for(j = 0;j < sum.m_columns;j++)
sum.m_dpp[i][j] = m_dpp[i][j] + m2.m_dpp[i][j];
return sum;
}
template <class T>
MyMatrix<T> MyMatrix<T>::operator-(const MyMatrix<T>& m2) const
{
int i, j;
if((m2.m_rows != m_rows) || (m2.m_columns != m_columns))
{
cout<<"Error, different rows and/or columns.\n"
<<"Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
MyMatrix difference(m2.m_rows,m2.m_columns);
for(i = 0;i < m2.m_rows;i++)
for(j = 0;j < m2.m_columns;j++)
difference.m_dpp[i][j] = m_dpp[i][j] - m2.m_dpp[i][j];
return difference;
}
template <class T>
T* MyMatrix<T>::operator[](int i)
{
if(i >= 0 && i < m_rows)
return m_dpp[i];
else
{
cout<<"Error, Out of Range. Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
}
template <class T>
T* MyMatrix<T>::operator[](int i) const
{
if(i >= 0 && i < m_rows)
return m_dpp[i];
else
{
cout<<"Error, Out of Range. Press enter to exit the program."<<flush;
cin.get();
cin.get();
exit(1);
}
}
template <class T>
void MyMatrix<T>::Read(istream& is)
{
int i, j;
int rows, columns;
if(is == cin)
{
cout<<"Enter the number of rows: "<<flush;
cin>>rows;
cout<<"Enter the number of columns: "<<flush;
cin>>columns;
if((rows == m_rows) && (columns == m_columns))
{
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
{
cout<<"m["<<i<<"]"<<"["<<j<<"] = "<<flush;
cin>>m_dpp[i][j];
}
}
}
else
{
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
m_rows = rows;
m_columns = columns;
T *dp;
dp = new T[m_rows*m_columns];
m_dpp = new T*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp + (i * m_columns);
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
{
cout<<"m["<<i<<"]"<<"["<<j<<"] = "<<flush;
cin>>m_dpp[i][j];
}
}
}
}
else
{
is>>m_rows;
is>>m_columns;
if(m_dpp != NULL)
{
delete [] m_dpp[0];
delete [] m_dpp;
}
T *dp;
dp = new T[m_rows*m_columns];
m_dpp = new T*[m_rows];
for(i = 0;i < m_rows;i++)
m_dpp[i] = dp + (i * m_columns);
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
is>>m_dpp[i][j];
}
}
}
template <class T>
void MyMatrix<T>::Write(ostream& os) const
{
int i, j;
if(os == cout)
{
if((m_rows == 0) || (m_columns == 0))
cout<<"The matrix is empty.\n";
for(i = 0;i < m_rows;i++)
{
if(i > 0)
cout<<"\n\n";
for(j = 0;j < m_columns;j++)
{
cout<<m_dpp[i][j]<<" ";
}
cout<<"\n";
}
}
else
{
for(i = 0;i < m_rows;i++)
{
for(j = 0;j < m_columns;j++)
{
os<<m_dpp[i][j]<<"\n";
}
}
}
}
template <class T>
istream& operator>>(istream& is, MyMatrix<T>& m)
{
m.Read(is);
return is;
}
template <class T>
ostream& operator<<(ostream& os, const MyMatrix<T>& m)
{
m.Write(os);
return os;
}