You are on page 1of 24

CMP 220

Mini Project 2D Matrix




Submitted to
Dr. Ghassan Qadah
Department of Computer Science and Engineering, CEN
American University of Sharjah

Submitted by
Rizwan Bakhsh (42130)
Mohammed Rashid (42500)

Submission Date
8th December 2013
P a g e | 1
Q1 and Q2:
Header:
#include<iostream>
#include<cmath>
using namespace std;
#ifndef MATRIX_H
#define MATRIX_H
class Matrix
{
friend istream & operator>>(istream &, Matrix &);
friend ostream & operator<<(ostream &, Matrix &);
friend double stdev (const Matrix & );
public:
Matrix(int =2,int =2);
Matrix(const Matrix &T);
Matrix & operator++();
Matrix operator++(int ig);
Matrix & operator--();
Matrix operator--(int ig);
Matrix & operator-();
Matrix operator-(Matrix& x);
Matrix operator+(Matrix& x);
Matrix operator*(Matrix& x);
Matrix operator=(Matrix& x);
Matrix & operator+=(Matrix );
bool operator==(Matrix & c);
bool operator!=(Matrix & c);
int & operator()(int m,int n);
const int & operator()(int m, int n)const;
void seti(int c);
void setj(int d);
void setelement(int * a[],int c,int d);
void setindel(int val,int c,int d);
int geti() const;
int getj() const;
int getindel(int c,int d) const;
double getmean() const;
void print();
~Matrix();
private:
int i,j;
int **arr;
};
#endif
P a g e | 2
Function:
#include "Matrix.h"
Matrix::Matrix(int k,int l)
{
i=k;
j=l;
arr=new int * [i];
for(int c=0;c<i;c++)
{ arr[c]=new int [j];
for(int h=0;h<j;h++)
arr[c][h]=0;
}
}
Matrix::Matrix(const Matrix &T)
{
i=T.i;
j=T.j;
arr=new int * [i];
for(int k=0;k<i;k++)
{ arr[k]=new int [j];
for(int h=0;h<j;h++)
arr[k][h]=T.arr[k][h];
}
}
Matrix & Matrix::operator++()
{
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
++arr[a][b];
}
return *this;
}
Matrix Matrix::operator++(int ig)
{
Matrix c=*this;
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
arr[a][b]++;
}
return c;
}
Matrix & Matrix::operator--()
{
for(int a=0;a<i;a++)
P a g e | 3
{
for(int b=0;b<j;b++)
--arr[a][b];
}
return *this;
}
Matrix Matrix::operator--(int ig)
{
Matrix c=*this;
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
arr[a][b]--;
}
return c;
}
Matrix & Matrix::operator-()
{
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
arr[a][b]*=-1;
}
return *this;
}
Matrix Matrix::operator-(Matrix& x)
{
if((i!=x.i)&&(j!=x.j))
{
cout<<"\nOperation not possible. Matrice sizes don't match!!!";
exit(1);
}
Matrix k=x;
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
{
k.arr[a][b]*=-1;
k.arr[a][b]+=arr[a][b];
}
}
return k;
}
Matrix Matrix::operator+(Matrix& x)
{
if((i!=x.i)&&(j!=x.j))
{
P a g e | 4
cout<<"\nOperation not possible. Matrice sizes don't match!!!";
exit(1);
}
Matrix k=x;
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
k.arr[a][b]+=arr[a][b];
}
return k;
}
Matrix Matrix::operator*(Matrix& x)
{
if(i!=x.j)
{
cout<<"\nMultiplication not possible\n";
return *this;
}
Matrix k(this->i,x.j);
for(int a=0;a<this->i;a++)
{
for(int b=0;b<x.j;b++)
{
for(int l=0;l<this->j;l++)
{
k.arr[a][b]+=this->arr[a][l]*x.arr[l][b];
}
}
}
return k;
}
Matrix Matrix::operator=(Matrix& x)
{
if(this==&x)
return *this;
for(int k=0;k<i;k++)
delete [] arr[k];
delete [] arr;
i=x.i;
j=x.j;
arr=new int * [i];
for(int a=0;a<i;a++)
{ arr[a]=new int [j];
for(int b=0;b<j;b++)
arr[a][b]=x.arr[a][b];
}
return *this;
P a g e | 5
}
Matrix & Matrix::operator+=(Matrix c)
{
if((i!=c.i)&&(j!=c.j))
{
cout<<"\nOperation not possible. Matrice sizes don't match!!!";
exit(1);
}
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
{
this->arr[a][b]+=c.arr[a][b];
}
}
return *this;
}
bool Matrix::operator==(Matrix & c)
{
if((i!=c.i)&&(j!=c.j))
{
return false;
}
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
{
if(this->arr[a][b]!=c.arr[a][b])
return false;
}
}
return true;

}
bool Matrix::operator!=(Matrix & c)
{
if(this==&c)
return false;
if((i!=c.i)&&(j!=c.j))
{
return true;
}
int count=0;
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
{
P a g e | 6
if(this->arr[a][b]==c.arr[a][b])
count++;
}
}
if(count==i*j)
return false;
return true;
}
int & Matrix::operator()(int m, int n)
{
return (arr[m][n]);
}
const int & Matrix::operator()(int m, int n)const
{
return (arr[m][n]);
}
void Matrix::seti(int c)
{
i=c;
}

void Matrix::setj(int d)
{
j=d;
}
void Matrix::setelement(int **a,int c,int d)
{
for(int h=0;h<i;h++)
delete [] arr[h];
delete [] arr;
i=c;
j=d;
arr=new int * [i];
for(int k=0;k<i;k++)
{ arr[k]=new int [j];
for(int h=0;h<j;h++)
arr[k][h]=a[k][h];
}
}
void Matrix::setindel(int val,int c,int d)
{
arr[c][d]=val;
}
int Matrix::geti() const
{
return i;
}
P a g e | 7
int Matrix::getj() const
{
return j;
}
int Matrix::getindel(int c,int d) const
{
return arr[c][d];
}
double Matrix::getmean() const
{
double mean=0;
for(int k=0;k<i;k++)
{
for(int h=0;h<j;h++)
mean+=(double)arr[k][h];
}
return mean/(i*j);
}
void Matrix::print()
{
for(int k=0;k<i;k++)
{cout<<'\n';
for(int h=0;h<j;h++)
cout<<arr[k][h]<<' ';
}
}
Matrix::~Matrix()
{
for(int k=0;k<i;k++)
delete [] arr[k];
delete [] arr;
}
istream & operator>>(istream & in, Matrix & A)
{
for(int a=0;a<A.i;a++)
{
for(int b=0;b<A.j;b++)
{
in>>A.arr[a][b];
}
}
return (in);
}
ostream & operator<<(ostream & out, Matrix & A)
{
for(int a=0;a<A.i;a++)
{
P a g e | 8
cout<<endl;
for(int b=0;b<A.j;b++)
{
out<<A.arr[a][b]<<' ';
}
}
return (out);
}
Main:
#include "Matrix.h"
double stdev (const Matrix & );
void main()
{
int i1,i2,j1,j2;
double stda,stdb;
cout<<"Enter the row and coloums of Matrix 1:\n";
cin>>i1;
cin>>j1;
Matrix A(i1,j1);
cout<<"\nEnter the elements of Integer Matrix 1:\n";
cin>>A;
cout<<"\nMatrix 1:"<<A<<'\n';
cout<<"\nEnter the row and coloums of Matrix 2:\n";
cin>>i2>>j2;
Matrix B(i2,j2);
cout<<"\nEnter the elements of Integer Matrix 2:\n";
cin>>B;
cout<<"\nMatrix 2:"<<B<<'\n';
if(A==B)
cout<<"\nEnter Matrices are same\n";
cout<<"\nMatrix 2["<<i2-1<<','<<j2-1<<"] = Matrix 1 ["<<i1-1<<','<<j1-
1<<"]\n";
B(i2-1,j2-1)=A(i1-1,j1-1);
cout<<"\n\nNew Matrix 2: "<<B<<endl;
cout<<"\nMatrix 2 pre-incremented:\n";
cout<<++B;
cout<<endl;
cout<<"\nMatrix 1 post-decremented";
cout<<A--;
cout<<"\nNew Matrix 1:"<<A;
cout<<endl;
cout<<"\nMatrix 1 += Matrix 2:";
cout<<(A+=B)<<endl;
cout<<"\nMatrix 1 * Matrix 2:";
cout<<A*B<<endl;
P a g e | 9
stda=stdev(A);
stdb=stdev(B);
cout<<"\nStandard Deviation of Matrix 1: "<<stda;
cout<<"\nStandard Deviation of Matrix 2: "<<stdb<<endl;
cout<<"\nMatrix 1 = Matrix 2:\n"<<(A=B);
if(!(A!=B))
cout<<"\n\nMatrices are same\n";
cout<<endl;

}
double stdev (const Matrix & A)
{
double sum=0;
double mean=A.getmean();
for(int h=0;h<A.i;h++)
{
for(int k=0;k<A.j;k++)
{
double y=A.arr[h][k]-mean;
sum+=y*y;
}
}
sum/=(A.i*A.j-1);
return sqrt((double)sum);
}











P a g e | 10
Output:


P a g e | 11
Q3:
Template Class:
#include<iostream>
#include<cmath>
using namespace std;
template <class P>
class Matrix
{
template <class P>
friend istream & operator>>(istream & in, Matrix<P> & A)
{
for(int a=0;a<A.i;a++)
{
for(int b=0;b<A.j;b++)
{
in>>A.arr[a][b];
}
}
return (in);
}

template <class P>
friend ostream & operator<<(ostream & out, Matrix<P> & A)
{
for(int a=0;a<A.i;a++)
{
out<<endl;
for(int b=0;b<A.j;b++)
{
out<<A.arr[a][b]<<' ';
}
}
return (out);
}
public:
Matrix(int =2,int =3);
Matrix(const Matrix<P> &T);
Matrix<P> & operator++();
Matrix<P> operator++(int ig);
Matrix<P> & operator--();
Matrix<P> operator--(int ig);
Matrix<P> & operator-();
Matrix<P> operator-(Matrix<P>& x);
Matrix<P> operator+(Matrix<P>& x);
Matrix<P> operator*(Matrix<P>& x);
P a g e | 12
Matrix<P> operator=(Matrix<P>& x);
Matrix<P> & operator+=(Matrix<P>& c);
bool operator==(Matrix<P> & c);
bool operator!=(Matrix<P> & c);
P & operator()(int m,int n);
const P & operator()(int m, int n)const;
void setij(int c, int m);
void setMatrix(P **a,int c,int d);
void setindel(P val,int c,int d);
int geti() const;
int getj() const;
P getindel(int c,int d) const;
double getmean() const;
~Matrix();
private:
int i,j;
P **arr;
};
template <class P>
double stdev (const Matrix<P> & );
void main()
{
int i1,i2,j1,j2;
double stda,stdb;
int in1,in2,jn1,jn2;
double stdan,stdbn;
cout<<"Integer Part\n";
cout<<"------------\n\n";
cout<<"Enter the row and coloums of Matrix 1:\n";
cin>>in1;
cin>>jn1;
Matrix<int> An(in1,jn1);
cout<<"\nEnter the elements of Integer Matrix 1:\n";
cin>>An;
cout<<"\nMatrix 1:"<<An<<'\n';
cout<<"\nEnter the row and coloums of Matrix 2:\n";
cin>>in2>>jn2;
Matrix<int> Bn(in2,jn2);
cout<<"\nEnter the elements of Integer Matrix 2:\n";
cin>>Bn;
cout<<"\nMatrix 2:"<<Bn<<'\n';
if(An==Bn)
cout<<"\nEnter Matrices are same\n";
cout<<"\nMatrix 2["<<in2-1<<','<<jn2-1<<"] = Matrix 1 ["<<in1-1<<','<<jn1-
1<<"]\n";
Bn(in2-1,jn2-1)=An(in1-1,jn1-1);
cout<<"\n\nNew Matrix 2: "<<Bn<<endl;
P a g e | 13
cout<<"\nMatrix 2 pre-incremented:\n";
cout<<++Bn;
cout<<endl;
cout<<"\nMatrix 1 post-decremented";
cout<<An--;
cout<<"\nNew Matrix 1:"<<An;
cout<<endl;
cout<<"\nMatrix 1 += Matrix 2:";
cout<<(An+=Bn)<<endl;
cout<<"\nMatrix 1 * Matrix 2:";
cout<<An*Bn<<endl;
stdan=stdev(An);
stdbn=stdev(Bn);
cout<<"\nStandard Deviation of Matrix 1: "<<stdan;
cout<<"\nStandard Deviation of Matrix 2: "<<stdbn<<endl;
cout<<"\nMatrix 1 = Matrix 2:\n"<<(An=Bn);
if(!(An!=Bn))
cout<<"\n\nMatrices are same\n";
cout<<endl;
cout<<"\nFloat Part\n";
cout<<"------------\n\n";
cout<<"Enter the row and coloums of Matrix 1:\n";
cin>>i1;
cin>>j1;
Matrix<float>A(i1,j1);
cout<<"\nEnter the elements of Float Matrix 1:\n";
cin>>A;
cout<<"\nMatrix 1:"<<A<<'\n';
cout<<"\nEnter the row and coloums of Matrix 2:\n";
cin>>i2>>j2;
Matrix<float> B(i2,j2);
cout<<"\nEnter the elements of Float Matrix 2:\n";
cin>>B;
cout<<"\nMatrix 2:"<<B<<'\n';
if(A==B)
cout<<"\nEnter Matrices are same\n";
cout<<"\nMatrix 2["<<i2-1<<','<<j2-1<<"] = Matrix 1 ["<<i1-1<<','<<j1-
1<<"]\n";
B(i2-1,j2-1)=A(i1-1,j1-1);
cout<<"\n\nNew Matrix 2: "<<B<<endl;
cout<<"\nMatrix 2 pre-incremented:\n";
cout<<++B;
cout<<endl;
cout<<"\nMatrix 1 post-decremented";
cout<<A--;
cout<<"\nNew Matrix 1:"<<A;
cout<<endl;
P a g e | 14
cout<<"\nMatrix 1 += Matrix 2:";
cout<<(A+=B)<<endl;
cout<<"\nMatrix 1 * Matrix 2:";
cout<<A*B<<endl;
stda=stdev(A);
stdb=stdev(B);
cout<<"\nStandard Deviation of Matrix 1: "<<stda;
cout<<"\nStandard Deviation of Matrix 2: "<<stdb<<endl;
cout<<"\nMatrix 1 = Matrix 2:\n"<<(A=B);
if(!(A!=B))
cout<<"\n\nMatrices are same\n";
cout<<endl;
}
template <class P>
double stdev (const Matrix<P> & A)
{
double y;
int sizi=A.geti();
int sizj=A.getj();
double sum=0;
double mean=A.getmean();
for(int h=0;h<sizi;h++)
{
for(int k=0;k<sizj;k++)
{
y=A.getindel(h,k)-mean;
sum+=y*y;
}
}
sum/=((sizi*sizj)-1);
return sqrt((double)sum);
}

template <class P>
Matrix<P>::Matrix(int k,int l)
{
i=k;
j=l;
arr=new P * [i];
for(int c=0;c<i;c++)
{
arr[c]=new P [j];
for(int h=0;h<j;h++)
arr[c][h]=0;
}
}
template <class P>
P a g e | 15
Matrix<P>::Matrix(const Matrix<P> &T)
{
i=T.i;
j=T.j;
arr=new P * [i];
for(int k=0;k<i;k++)
{
arr[k]=new P [j];
for(int h=0;h<j;h++)
arr[k][h]=T.arr[k][h];
}
}
template <class P>
Matrix<P> & Matrix<P>::operator++()
{
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
++arr[a][b];
}
return *this;
}
template <class P>
Matrix<P> Matrix<P>::operator++(int ig)
{
Matrix<P> c=*this;
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
arr[a][b]++;
}
return c;
}
template <class P>
Matrix<P> & Matrix<P>::operator--()
{
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
--arr[a][b];
}
return *this;
}
template <class P>
Matrix<P> Matrix<P>::operator--(int ig)
{
Matrix<P> c=*this;
P a g e | 16
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
arr[a][b]--;
}
return c;
}
template <class P>
Matrix<P> & Matrix<P>::operator-()
{
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
arr[a][b]*=-1;
}
return *this;
}
template <class P>
Matrix<P> Matrix<P>::operator-(Matrix<P>& x)
{
if((i!=x.i)&&(j!=x.j))
{
cout<<"\nOperation not possible. Matrice sizes don't match!!!";
exit(1);
}
Matrix<P> k=x;
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
{
k.arr[a][b]*=-1;
k.arr[a][b]+=arr[a][b];
}
}
return k;
}
template <class P>
Matrix<P> Matrix<P>::operator+(Matrix<P>& x)
{
if((i!=x.i)&&(j!=x.j))
{
cout<<"\nOperation not possible. Matrice sizes don't match!!!";
exit(1);
}
Matrix<P> k;
for(int a=0;a<i;a++)
{
P a g e | 17
for(int b=0;b<j;b++)
k.arr[a][b]=arr[a][b]+ x.arr[a][b];
}
return k;
}
template <class P>
Matrix<P> Matrix<P>::operator*(Matrix<P>& x)
{
if(i!=x.j)
{
cout<<"\nMultiplication not possible\n";
return *this;
}
Matrix<P> k(this->i,x.j);
for(int a=0;a<this->i;a++)
{
for(int b=0;b<x.j;b++)
{
for(int l=0;l<this->j;l++)
{
k.arr[a][b]+=this->arr[a][l]*x.arr[l][b];
}
}
}
return k;
}
template <class P>
Matrix<P> Matrix<P>::operator=(Matrix<P>& x)
{
if(this==&x)
return *this;
for(int k=0;k<i;k++)
delete [] arr[k];
delete [] arr;
i=x.i;
j=x.j;
arr=new P * [i];
for(int a=0;a<i;a++)
{
arr[a]=new P [j];
for(int b=0;b<j;b++)
arr[a][b]=x.arr[a][b];
}
return *this;
}
template <class P>
Matrix<P> & Matrix<P>::operator+=(Matrix<P>& c)
P a g e | 18
{
if((i!=c.i)&&(j!=c.j))
{
cout<<"\nOperation not possible. Matrice sizes don't match!!!";
exit(1);
}
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
{
this->arr[a][b]+=c.arr[a][b];
}
}
return *this;
}
template <class P>
bool Matrix<P>::operator==(Matrix<P> & c)
{
if((i!=c.i)&&(j!=c.j))
{
return false;
}
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
{
if(this->arr[a][b]!=c.arr[a][b])
return false;
}
}
return true;
}
template <class P>
bool Matrix<P>::operator!=(Matrix<P> & c)
{
if(this==&c)
return false;
if((i!=c.i)&&(j!=c.j))
{
return true;
}
int count=0;
for(int a=0;a<i;a++)
{
for(int b=0;b<j;b++)
{
if(this->arr[a][b]==c.arr[a][b])
P a g e | 19
count++;
}
}
if(count==(i*j))
return false;
return true;
}
template <class P>
P & Matrix<P>::operator()(int m, int n)
{
return (arr[m][n]);
}
template <class P>
const P & Matrix<P>::operator()(int m, int n)const
{
return (arr[m][n]);
}
template <class P>
void Matrix<P>::setij(int c, int m)
{
i=c;
j=m;
}
template <class P>
void Matrix<P>::setMatrix(P **a,int c,int d)
{
for(int h=0;h<i;h++)
delete [] arr[h];
delete [] arr;
i=c;
j=d;
arr=new P *[i];
for(int k=0;k<i;k++)
{
arr[k]=new P [j];
for(int h=0;h<j;h++)
arr[k][h]=a[k][h];
}
}
template <class P>
void Matrix<P>::setindel(P val,int c,int d)
{
arr[c][d]=val;
}
template <class P>
int Matrix<P>::geti() const
{
P a g e | 20
return i;
}
template <class P>
int Matrix<P>::getj() const
{
return j;
}
template <class P>
P Matrix<P>::getindel(int c,int d) const
{
return (arr[c][d]);
}
template <class P>
double Matrix<P>::getmean() const
{
double mean=0;
for(int k=0;k<i;k++)
{
for(int h=0;h<j;h++)
mean+=(double)arr[k][h];
}
return (mean/(i*j));
}
template <class P>
Matrix<P>::~Matrix()
{
for(int k=0;k<i;k++)
delete [] arr[k];
delete [] arr;
}








Output:
P a g e | 21


P a g e | 22


P a g e | 23

You might also like