C program of Matrix Multiplication using Pointers

Mr Coder February 15, 2013 2




C program of Matrix Multiplication using Pointers : Let us discuss how to multiply M x N matrix using a C program. First of all we need to understand how an M x N matrix multiplication takes place. Matrix multiplication is a binary operation that takes a pair of matrices, and produces another matrix as output. Matrix is basically a two dimensional array. Let us see by an example how to multiply a matrix by another matrix :

C program for Matrix Multiplication

As above shown, matrix multiplication consists a concept of dot products of rows and columns.

The “Dot Product” is where you multiply matching members, then sum up:

(1, 2, 3) • (7, 9, 11) = 1×7 + 2×9 + 3×11 = 58

We match the 1st members (1 and 7), multiply them, likewise for the 2nd members (2 and 9) and the 3rd members (3 and 11), and finally sum them up.

Lets see for another row ..

(1, 2, 3) • (8, 10, 12) = 1×8 + 2×10 + 3×12 = 64

 

C program for Matrix Multiplication

 

We can do the same thing for the 2nd row and 1st column:

(4, 5, 6) • (7, 9, 11) = 4×7 + 5×9 + 6×11 = 139

And for the 2nd row and 2nd column:

(4, 5, 6) • (8, 10, 12) = 4×8 + 5×10 + 6×12 = 154

So this is the resultant matrix obtained after multiplication :

C program for Matrix Multiplication

 

Now lets see how we are going to implement above logic of multiplying matrices in C using pointers.

C program of Matrix Multiplication using Pointers :

#include <stdio.h> 
#include <stdlib.h> 

//Define functions that will be used in the program 
void multiplyMatrices(); 
void getRowColumn(int *row, int *col, char *matrix); 
int *createMatrix(int *row, int *col); 
void getMatrixValues(int *source, int row, int col, char *name); 
int *destroyMatrix(int *matrix); 
void printMatrix(const int *source, int row, int col); 

//Start of main 
int main() 
{ 
//Call multiplyMatrices function 
multiplyMatrices(); 
//End main 
return(0); 
//End of main 
} 

//Start of multiplyMatrices function 
void multiplyMatrices() 
{ 
//Declare variables 
int oneRow, oneCol, twoRow, twoCol, i, j, k; 

//Call getRowColumn to ask user for the matrix size for both matrices 
getRowColumn(&oneRow, &oneCol, "Matrix 1"); 
getRowColumn(&twoRow, &twoCol, "Matrix 2"); 

//The number of columns in oneMatrix must equal the number of rows in twoMatrix 
if(oneCol != twoRow) 
{ 
printf("The number of columns in the first matrix must equal the number of rows in the second matrix.\n"); 
exit(EXIT_FAILURE); 
} 

//Create the arrays in the heap memory 
int *oneMatrix = createMatrix(&oneRow, &oneCol); 
int *twoMatrix = createMatrix(&twoRow, &twoCol); 
int *multipliedMatrix = createMatrix(&oneRow, &twoCol); 

//Declare pointer variables to store the initial locations of 
//my arrays for later use 
int *initialOneMatrix, *initialTwoMatrix, *initialMultipliedMatrix; 
initialOneMatrix = oneMatrix; 
initialTwoMatrix = twoMatrix; 
initialMultipliedMatrix = multipliedMatrix; 

//Ask user for the values of each matrix 
getMatrixValues(oneMatrix, oneRow, oneCol, "Matrix 1"); 
getMatrixValues(twoMatrix, twoRow, twoCol, "Matrix 2"); 

//Multiply the matrices (took me like 5 hours in 
//the debugger to figure out how to arrange these loops lol) 
//A for loop while i is less than oneRow(number of rows in first matrix) 
for(i = 0; i < oneRow; i++) 
{ 
//A for loop while j is less than twoCol 
for(j = 0; j < twoCol; j++) 
{ 
//Increment the address of oneMatrix by its number of columns multiplied by i 
oneMatrix += (oneCol * i); 
//Increment the address of twoMatrix by j 
twoMatrix += j; 

//A for loop while k is less than oneCol 
for(k = 0; k < oneCol; k++) 
{ 
//Multiply the current entries of the matracies and add the answer to the current entry for the multiplied matrix 
*multipliedMatrix += *oneMatrix * *twoMatrix; 
//Increment oneMatrix by 1 
oneMatrix++; 
//Increment twoMatrix by the number of its columns 
twoMatrix += twoCol; 
} 
//Increment multipliedMatrix 
multipliedMatrix++; 
//"Rewind" oneMatrix to its original address 
oneMatrix = initialOneMatrix; 
//"Rewind" twoMatrix to its original address 
twoMatrix = initialTwoMatrix; 
} 
} 

//"Rewind" multipliedMatrix to its original address 
multipliedMatrix = initialMultipliedMatrix; 

//Newline to make it pretty 
printf("\n"); 
//Call printMatrix function to print oneMatrix 
printMatrix(oneMatrix, oneRow, oneCol); 
//Newline, multiplication symbol, and two more newlines to make it pretty 
printf("\n*\n\n"); 
//Call printMatrix function to print twoMatrix 
printMatrix(twoMatrix, twoRow, twoCol); 
//Newline, equal sign, and two more newlines to make it pretty 
printf("\n=\n\n"); 
//Call printMatrix function to print multipliedMatrix 
printMatrix(multipliedMatrix, oneRow, twoCol); 

//Call destroyMatrix function to clear clear all of the matrices from memory 
destroyMatrix(oneMatrix); 
destroyMatrix(twoMatrix); 
destroyMatrix(multipliedMatrix); 

return; 
//End of multiplyMatrices 
} 

//Start of getRowColumn function 
void getRowColumn(int *row, int *col, char *matrix) 
{ 
//Ask user how many rows for the specified matrix 
printf("Please enter the number of rows for %s\n", matrix); 
//Set variable 'row' to what the user input 
scanf("%d", row); 
//Ask user how many columns for the specified array 
printf("Please enter the number of columns for %s\n", matrix); 
//Set variable 'col' to what the user input 
scanf("%d", col); 
//End of getRowColumn 
} 

//Start of createMatrix function 
int *createMatrix(int *row, int *col) 
{ 
//Initialize the new matrix in the heap memory using calloc with row times 
//col for an argument and using sizeof to let calloc know the size of int 
int *newMatrix = calloc(*row * *col, sizeof(int)); 

//Check if newMatrix is nonexistent, if so the memory 
//was unable to allocate and exit the program 
if(!newMatrix) 
{ 
printf("Unable to allocate memory.\n"); 
exit(EXIT_FAILURE); 
} 

//Return the newMatrix to where the function was called 
return(newMatrix); 
//End of createMatrix 
} 

//Start of getMatrixValues 
void getMatrixValues(int *source, int row, int col, char *name) 
{ 
//Declare counting variables for the for loops 
int i, j; 

//For loop to cycle through the rows 
for(i = 0; i < row; i++) 
{ 
//For loop to cycle through the columns 
for(j = 0; j < col; j++) 
{ 
//Ask user for a value for the specified entry 
printf("Enter the value for %d %d for %s\n", i, j, name); 
//Set source to what the user input, then increment source by 1 
scanf("%d", source++); 
} 
} 
//End of getMatrixValues 
} 

//Start of destroyMatrix function 
int *destroyMatrix(int *matrix) 
{ 
//Check if matrix exists 
if(matrix) 
{ 
//Function to free the matrix from memory 
free(matrix); 
} 
return(NULL); 
//End of destroyMatrix 
} 

//Start of printMatrix function 
void printMatrix(const int *source, int row, int col) 
{ 
//Declare counting variables for the for loops 
int i, j; 

//Cycle through the rows 
for(i = 0; i < row; i++) 
{ 
//Print beginning "side" to the matrix 
printf("|"); 
//Cycle through the columns 
for(j = 0; j < col; j++) 
{ 
//Print the specified matrix entry 
printf("%5d", *source++); 
} 
//Print an ending "side" to the matrix with a newline 
printf("|\n"); 
} 
//End of printMatrix 
}

 I hope you all have enjoyed the code. Special thanks to Apoc and Miss Pelling for code. If you have any queries or doubts ask us in form of comments.

2 Comments »

  1. Gaurav @ Microsoft Tips February 16, 2013 at 10:57 am - Reply

    Really Good And Awesome tutorial. Thanks a Lot For Making Such a Website

  2. Vlad December 19, 2013 at 11:36 am - Reply

    Thank you, it’s article helped me.

Leave A Response »