Sunday, November 27, 2011

Program for Matrix Multiplication in C++ using Operator Overloading

Program for Matrix Multiplication in C++ using Operator Overloading :
We will now try to multiply two matrix by using the concept of operator overloading. The described way is very very easy to understand. We will be overloading "*" operator for this purpose. Although this can be done by any binary operator.

We will start with a basic class Matrix. In this example we will take a 3x3 matrix.
Description:
  • class Matrix has a constructor that will initialize its element to 0.
  • also has a set() function that can be used to set values in the Matrix.
  • A show() function shows the matrix.
  • operator overloading definition for "*" operator.

Code:

#include<iostream>

using namespace std;

class matrix
{
    
    public:
    int a[3][3];
    
    matrix()//default constructor
    {
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<3;j++)
            {
                a[i][j]=0;
            }
        }
    }
    void set()// to set matrix elements
    {
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<3;j++)
            {
                cout<<"\n Enter "<<i<<","<<j<<" element=";
                cin>>a[i][j];
            }
        }
    }
    void show()// to show matrix elements
    {
        cout<<"\n Matrix is=\n";
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<3;j++)
            {
                
                cout<<a[i][j]<<",";
            }
            cout<<"\n";
        }
    }
    /*
    binary * operator will require one more arg, since it is a binary operator
    one arg is the object itself that will call it, other will be passed as arg(in this case x). also this will return a matrix object
    */
    matrix operator*(matrix x)// overloading * for multiplication
    {
        matrix c;// this will hold our result
        for(int i=0;i<3;i++)
        {
            for(int j=0;j<3;j++)
            {
                c.a[i][j]=0;
                for(int k=0;k<3;k++)
                {
                    c.a[i][j]=c.a[i][j]+a[i][k]*x.a[k][j];        
                }
            }
        }
        return(c);
        
    }
};

int main()
{
    matrix a,b,c;
    a.set();
    b.set();
    c=a*b;
    /*
    note that compiler will break this statement as 
    c=a.operator*(b);
    this is how 2nd arg is passed.
    and this is how object "a" acts as the calling object
    */
    
    a.show();
    b.show();
    c.show();
}