Directory:Derek Elder/Programs/MyMatrix
MyWikiBiz, Author Your Legacy — Tuesday November 19, 2024
Jump to navigationJump to searchMyMatrix.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; }