C++ - Matrix Multiplication
I have given the program for matrix addition, subtraction, multplication and comparison. The class CMatrix is using operator overloading *, =, ==, >> and << along with copy constructor.
If want to do matrix multliplication with out classes, then click here.
Source Code
#include <stdio.h>
#include <iostream>
#include <tchar.h>
#include <math.h>
class CMatrix
{
private:
int m_rows;
int m_cols;
int **m_pData;
char m_name[128];
CMatrix();
public:
CMatrix(const char *name, int rows, int cols) : m_rows(rows), m_cols(cols)
{
strcpy(m_name, name);
m_pData = new int*[m_rows];
for(int i = 0; i < m_rows; i++)
m_pData[i] = new int[m_cols];
for(int i = 0; i < m_rows; i++)
{
for(int j = 0; j < m_cols; j++)
{
m_pData[i][j] = 0;
}
}
}
CMatrix(const CMatrix &other)
{
strcpy(m_name, other.m_name);
m_rows = other.m_rows;
m_cols = other.m_cols;
m_pData = new int*[m_rows];
for(int i = 0; i < m_rows; i++)
m_pData[i] = new int[m_cols];
for(int i = 0; i < m_rows; i++)
{
for(int j = 0; j < m_cols; j++)
{
m_pData[i][j] = other.m_pData[i][j];
}
}
}
~CMatrix()
{
for(int i = 0; i < m_rows; i++)
delete [] m_pData[i];
delete [] m_pData;
m_rows = m_cols = 0;
}
void SetName(const char *name) { strcpy(m_name, name); }
const char* GetName() const { return m_name; }
void GetInput()
{
std::cin >> *this;
}
void FillSimulatedInput()
{
static int factor1 = 10, factor2 = 5;
std::cout << "\n\nEnter Input For Matrix : " << m_name << " Rows: " << m_rows << " Cols: " << m_cols << "\n";
for(int i = 0; i < m_rows; i++)
{
for(int j = 0; j < m_cols; j++)
{
std::cout << "Input For Row: " << i + 1 << " Col: " << j + 1 << " = ";
int data = ((i + 1) * factor1) + (j + 1) * factor2;
m_pData[i][j] = data;
std::cout << m_pData[i][j] << "\n";
}
std::cout << "\n";
}
factor1 += 5;
factor2 += 5;
std::cout << "\n";
}
CMatrix& operator = (const CMatrix &other)
{
if( this->m_rows != other.m_rows ||
this->m_cols != other.m_cols)
{
std::cout << "WARNING: Assignment is taking place with by changing the number of rows and columns of the matrix";
}
for(int i = 0; i < m_rows; i++)
delete [] m_pData[i];
delete [] m_pData;
m_rows = m_cols = 0;
strcpy(m_name, other.m_name);
m_rows = other.m_rows;
m_cols = other.m_cols;
m_pData = new int*[m_rows];
for(int i = 0; i < m_rows; i++)
m_pData[i] = new int[m_cols];
for(int i = 0; i < m_rows; i++)
{
for(int j = 0; j < m_cols; j++)
{
m_pData[i][j] = other.m_pData[i][j];
}
}
return *this;
}
CMatrix operator + (const CMatrix &other)
{
if( this->m_rows != other.m_rows ||
this->m_cols != other.m_cols)
{
std::cout << "Addition could not take place because number of rows and columns are different between the two matrices";
return *this;
}
CMatrix result("", m_rows, m_cols);
for(int i = 0; i < m_rows; i++)
{
for(int j = 0; j < m_cols; j++)
{
result.m_pData[i][j] = this->m_pData[i][j] + other.m_pData[i][j];
}
}
return result;
}
CMatrix operator - (const CMatrix &other)
{
if( this->m_rows != other.m_rows ||
this->m_cols != other.m_cols)
{
std::cout << "Subtraction could not take place because number of rows and columns are different between the two matrices";
return *this;
}
CMatrix result("", m_rows, m_cols);
for(int i = 0; i < m_rows; i++)
{
for(int j = 0; j < m_cols; j++)
{
result.m_pData[i][j] = this->m_pData[i][j] - other.m_pData[i][j];
}
}
return result;
}
CMatrix operator * (const CMatrix &other)
{
if( this->m_cols != other.m_rows)
{
std::cout << "Multiplication could not take place because number of columns of 1st Matrix and number of rows in 2nd Matrix are different";
return *this;
}
CMatrix result("", this->m_rows, other.m_cols);
for(int i = 0; i < this->m_rows; i++)
{
for(int j = 0; j < other.m_cols; j++)
{
for(int k = 0; k < this->m_cols; k++)
{
result.m_pData[i][j] += this->m_pData[i][k] * other.m_pData[k][j];
}
}
}
return result;
}
bool operator == (const CMatrix &other)
{
if( this->m_rows != other.m_rows ||
this->m_cols != other.m_cols)
{
std::cout << "Comparision could not take place because number of rows and columns are different between the two matrices";
return false;
}
CMatrix result("", m_rows, m_cols);
bool bEqual = true;
for(int i = 0; i < m_rows; i++)
{
for(int j = 0; j < m_cols; j++)
{
if(this->m_pData[i][j] != other.m_pData[i][j])
bEqual = false;
}
}
return bEqual;
}
void DisplayMatrix()
{
std::cout << *this;
}
friend std::istream& operator >> (std::istream &is, CMatrix &m);
friend std::ostream& operator << (std::ostream &os, const CMatrix &m);
};
std::istream& operator >> (std::istream &is, CMatrix &m)
{
std::cout << "\n\nEnter Input For Matrix : " << m.m_name << " Rows: " << m.m_rows << " Cols: " << m.m_cols << "\n";
for(int i = 0; i < m.m_rows; i++)
{
for(int j = 0; j < m.m_cols; j++)
{
std::cout << "Input For Row: " << i + 1 << " Col: " << j + 1 << " = ";
is >> m.m_pData[i][j];
}
std::cout << "\n";
}
std::cout << "\n";
return is;
}
std::ostream& operator << (std::ostream &os,const CMatrix &m)
{
os << "\n\nMatrix : " << m.m_name << " Rows: " << m.m_rows << " Cols: " << m.m_cols << "\n\n";
for(int i = 0; i < m.m_rows; i++)
{
os << " | ";
for(int j = 0; j < m.m_cols; j++)
{
os.width(4);
os << m.m_pData[i][j] << " ";
}
os << "|\n";
}
os << "\n\n";
return os;
}
void main()
{
CMatrix a("A", 4,3);
CMatrix b("B", 3,2);
//You do not need to key in, if you use FillSimulatedInput() function
a.FillSimulatedInput();
b.FillSimulatedInput();
//std::cin >> a;
//std::cin >> b;
CMatrix c = a * b;
c.SetName("C");
std::cout << a;
std::cout << b;
c.DisplayMatrix();
}
Output
Enter Input For Matrix : A Rows: 4 Cols: 3
Input For Row: 1 Col: 1 = 15
Input For Row: 1 Col: 2 = 20
Input For Row: 1 Col: 3 = 25
Input For Row: 2 Col: 1 = 25
Input For Row: 2 Col: 2 = 30
Input For Row: 2 Col: 3 = 35
Input For Row: 3 Col: 1 = 35
Input For Row: 3 Col: 2 = 40
Input For Row: 3 Col: 3 = 45
Input For Row: 4 Col: 1 = 45
Input For Row: 4 Col: 2 = 50
Input For Row: 4 Col: 3 = 55
Enter Input For Matrix : B Rows: 3 Cols: 2
Input For Row: 1 Col: 1 = 25
Input For Row: 1 Col: 2 = 35
Input For Row: 2 Col: 1 = 40
Input For Row: 2 Col: 2 = 50
Input For Row: 3 Col: 1 = 55
Input For Row: 3 Col: 2 = 65
Matrix : A Rows: 4 Cols: 3
| 15 20 25 |
| 25 30 35 |
| 35 40 45 |
| 45 50 55 |
Matrix : B Rows: 3 Cols: 2
| 25 35 |
| 40 50 |
| 55 65 |
Matrix : C Rows: 4 Cols: 2
| 2550 3150 |
| 3750 4650 |
| 4950 6150 |
| 6150 7650 |
Press any key to continue . . .
|