|
|
Line 1: |
Line 1: |
− | ==MyMatrix.h==
| + | #REDIRECT[[Directory:Derek Elder/Programs/MyMatrix]] |
− | <pre>
| |
− | #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);
| |
− | </pre>
| |
− | ==MyMatrix.cpp==
| |
− | <pre>
| |
− | #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;
| |
− | }
| |
− | </pre>
| |
− | ==Main.cpp==
| |
− | <pre>
| |
− | #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();*/
| |
− | }
| |
− | </pre>
| |