C Program to multiply two matrices
Given two matrices, the task to multiply them. Matrices can either be square or rectangular.
Examples:Â
Input : mat1[][] = {{1, 2}, {3, 4}} mat2[][] = {{1, 1}, {1, 1}} Output : {{3, 3}, {7, 7}} Input : mat1[][] = {{2, 4}, {3, 4}} mat2[][] = {{1, 2}, {1, 3}} Output : {{6, 16}, {7, 18}}
Multiplication of Square Matrices :Â
The below program multiplies two square matrices of size 4*4, we can change N for different dimensions.Â
C
// C program to multiply two square matrices. #include <stdio.h> #define N 4 // This function multiplies mat1[][] and mat2[][], // and stores the result in res[][] void multiply( int mat1[][N], int mat2[][N], int res[][N]) { int i, j, k; for (i = 0; i < N; i++) { for (j = 0; j < N; j++) { res[i][j] = 0; for (k = 0; k < N; k++) res[i][j] += mat1[i][k] * mat2[k][j]; } } } int main() { int mat1[N][N] = { { 1, 1, 1, 1 }, { 2, 2, 2, 2 }, { 3, 3, 3, 3 }, { 4, 4, 4, 4 } }; int mat2[N][N] = { { 1, 1, 1, 1 }, { 2, 2, 2, 2 }, { 3, 3, 3, 3 }, { 4, 4, 4, 4 } }; int res[N][N]; // To store result int i, j; multiply(mat1, mat2, res); printf ("Result matrix is "); for (i = 0; i < N; i++) { for (j = 0; j < N; j++) printf ( "%d " , res[i][j]); printf (" "); } return 0; } |
Output
Result matrix is 10 10 10 10 20 20 20 20 30 30 30 30 40 40 40 40
Time complexity: O(n3). It can be optimized using Strassen’s Matrix Multiplication
Auxiliary Space: O(n2)
Multiplication of Rectangular Matrices :Â
We use pointers in C to multiply to matrices. Please refer to the following post as a prerequisite of the code.
How to pass a 2D array as a parameter in C?Â
C
// C program to multiply two rectangular matrices #include <stdio.h> // Multiplies two matrices mat1[][] and mat2[][] // and prints result. // (m1) x (m2) and (n1) x (n2) are dimensions // of given matrices. void multiply( int m1, int m2, int mat1[][m2], int n1, int n2, int mat2[][n2]) { int x, i, j; int res[m1][n2]; for (i = 0; i < m1; i++) { for (j = 0; j < n2; j++) { res[i][j] = 0; for (x = 0; x < m2; x++) { *(*(res + i) + j) += *(*(mat1 + i) + x) * *(*(mat2 + x) + j); } } } for (i = 0; i < m1; i++) { for (j = 0; j < n2; j++) { printf ( "%d " , *(*(res + i) + j)); } printf (" "); } } // Driver code int main() { int mat1[][2] = { { 2, 4 }, { 3, 4 } }; int mat2[][2] = { { 1, 2 }, { 1, 3 } }; int m1 = 2, m2 = 2, n1 = 2, n2 = 2; // Function call multiply(m1, m2, mat1, n1, n2, mat2); return 0; } |
Output
6 16 7 18
Time complexity: O(n3). It can be optimized using Strassen’s Matrix Multiplication
Auxiliary Space: O(m1 * n2)
Please Login to comment...