Search code examples
carraysmatrix-multiplication

Matrix multiplication using array generating erronous results


The following code multiplies two matrices of different orders and returns results i.e mat1 (6x3) * mat2 (3x6) and returns 6x6 matrix in dest

The problem is the result doesn't match with the calculated value. Additionally, if you observe the results mat2 is changing its contents.

PS: iterals: 3, 0, 1 mat1[3][1] = 0.000000 mat2[1][0] = 20.000000 dest[3][0] = 0.000000

The original content of mat2[1][0] was zero.

OUTPUT:

iterals: 0, 0, 0    mat1[0][0] = 10.000000  mat2[0][0] = 1.000000   dest[0][0] = 10.000000
iterals: 0, 0, 1    mat1[0][1] = 0.000000   mat2[1][0] = 0.000000   dest[0][0] = 10.000000
iterals: 0, 0, 2    mat1[0][2] = 0.000000   mat2[2][0] = 0.000000   dest[0][0] = 10.000000
iterals: 0, 1, 0    mat1[0][0] = 10.000000  mat2[0][1] = 0.000000   dest[0][1] = 0.000000
iterals: 0, 1, 1    mat1[0][1] = 0.000000   mat2[1][1] = 0.000000   dest[0][1] = 0.000000
iterals: 0, 1, 2    mat1[0][2] = 0.000000   mat2[2][1] = 0.000000   dest[0][1] = 0.000000
iterals: 0, 2, 0    mat1[0][0] = 10.000000  mat2[0][2] = 0.000000   dest[0][2] = 0.000000
iterals: 0, 2, 1    mat1[0][1] = 0.000000   mat2[1][2] = 1.000000   dest[0][2] = 0.000000
iterals: 0, 2, 2    mat1[0][2] = 0.000000   mat2[2][2] = 0.000000   dest[0][2] = 0.000000
iterals: 0, 3, 0    mat1[0][0] = 10.000000  mat2[0][3] = 0.000000   dest[0][3] = 0.000000
iterals: 0, 3, 1    mat1[0][1] = 0.000000   mat2[1][3] = 0.000000   dest[0][3] = 0.000000
iterals: 0, 3, 2    mat1[0][2] = 0.000000   mat2[2][3] = 0.000000   dest[0][3] = 0.000000
iterals: 0, 4, 0    mat1[0][0] = 10.000000  mat2[0][4] = 0.000000   dest[0][4] = 0.000000
iterals: 0, 4, 1    mat1[0][1] = 0.000000   mat2[1][4] = 0.000000   dest[0][4] = 0.000000
iterals: 0, 4, 2    mat1[0][2] = 0.000000   mat2[2][4] = 1.000000   dest[0][4] = 0.000000
iterals: 0, 5, 0    mat1[0][0] = 10.000000  mat2[0][5] = 0.000000   dest[0][5] = 0.000000
iterals: 0, 5, 1    mat1[0][1] = 0.000000   mat2[1][5] = 0.000000   dest[0][5] = 0.000000
iterals: 0, 5, 2    mat1[0][2] = 0.000000   mat2[2][5] = 0.000000   dest[0][5] = 0.000000
iterals: 1, 0, 0    mat1[1][0] = 0.000000   mat2[0][0] = 1.000000   dest[1][0] = 0.000000
iterals: 1, 0, 1    mat1[1][1] = 0.000000   mat2[1][0] = 0.000000   dest[1][0] = 0.000000
iterals: 1, 0, 2    mat1[1][2] = 0.000000   mat2[2][0] = 0.000000   dest[1][0] = 0.000000
iterals: 1, 1, 0    mat1[1][0] = 0.000000   mat2[0][1] = 0.000000   dest[1][1] = 0.000000
iterals: 1, 1, 1    mat1[1][1] = 0.000000   mat2[1][1] = 0.000000   dest[1][1] = 0.000000
iterals: 1, 1, 2    mat1[1][2] = 0.000000   mat2[2][1] = 0.000000   dest[1][1] = 0.000000
iterals: 1, 2, 0    mat1[1][0] = 0.000000   mat2[0][2] = 0.000000   dest[1][2] = 0.000000
iterals: 1, 2, 1    mat1[1][1] = 0.000000   mat2[1][2] = 1.000000   dest[1][2] = 0.000000
iterals: 1, 2, 2    mat1[1][2] = 0.000000   mat2[2][2] = 0.000000   dest[1][2] = 0.000000
iterals: 1, 3, 0    mat1[1][0] = 0.000000   mat2[0][3] = 0.000000   dest[1][3] = 0.000000
iterals: 1, 3, 1    mat1[1][1] = 0.000000   mat2[1][3] = 0.000000   dest[1][3] = 0.000000
iterals: 1, 3, 2    mat1[1][2] = 0.000000   mat2[2][3] = 0.000000   dest[1][3] = 0.000000
iterals: 1, 4, 0    mat1[1][0] = 0.000000   mat2[0][4] = 0.000000   dest[1][4] = 0.000000
iterals: 1, 4, 1    mat1[1][1] = 0.000000   mat2[1][4] = 0.000000   dest[1][4] = 0.000000
iterals: 1, 4, 2    mat1[1][2] = 0.000000   mat2[2][4] = 1.000000   dest[1][4] = 0.000000
iterals: 1, 5, 0    mat1[1][0] = 0.000000   mat2[0][5] = 0.000000   dest[1][5] = 0.000000
iterals: 1, 5, 1    mat1[1][1] = 0.000000   mat2[1][5] = 0.000000   dest[1][5] = 0.000000
iterals: 1, 5, 2    mat1[1][2] = 0.000000   mat2[2][5] = 0.000000   dest[1][5] = 0.000000
iterals: 2, 0, 0    mat1[2][0] = 0.000000   mat2[0][0] = 0.000000   dest[2][0] = 0.000000
iterals: 2, 0, 1    mat1[2][1] = 20.000000  mat2[1][0] = 0.000000   dest[2][0] = 0.000000
iterals: 2, 0, 2    mat1[2][2] = 0.000000   mat2[2][0] = 0.000000   dest[2][0] = 0.000000
iterals: 2, 1, 0    mat1[2][0] = 0.000000   mat2[0][1] = 0.000000   dest[2][1] = 0.000000
iterals: 2, 1, 1    mat1[2][1] = 20.000000  mat2[1][1] = 0.000000   dest[2][1] = 0.000000
iterals: 2, 1, 2    mat1[2][2] = 0.000000   mat2[2][1] = 0.000000   dest[2][1] = 0.000000
iterals: 2, 2, 0    mat1[2][0] = 0.000000   mat2[0][2] = 0.000000   dest[2][2] = 0.000000
iterals: 2, 2, 1    mat1[2][1] = 20.000000  mat2[1][2] = 1.000000   dest[2][2] = 20.000000
iterals: 2, 2, 2    mat1[2][2] = 0.000000   mat2[2][2] = 0.000000   dest[2][2] = 20.000000
iterals: 2, 3, 0    mat1[2][0] = 0.000000   mat2[0][3] = 0.000000   dest[2][3] = 0.000000
iterals: 2, 3, 1    mat1[2][1] = 20.000000  mat2[1][3] = 0.000000   dest[2][3] = 0.000000
iterals: 2, 3, 2    mat1[2][2] = 0.000000   mat2[2][3] = 0.000000   dest[2][3] = 0.000000
iterals: 2, 4, 0    mat1[2][0] = 0.000000   mat2[0][4] = 0.000000   dest[2][4] = 0.000000
iterals: 2, 4, 1    mat1[2][1] = 20.000000  mat2[1][4] = 0.000000   dest[2][4] = 0.000000
iterals: 2, 4, 2    mat1[2][2] = 0.000000   mat2[2][4] = 1.000000   dest[2][4] = 0.000000
iterals: 2, 5, 0    mat1[2][0] = 0.000000   mat2[0][5] = 0.000000   dest[2][5] = 0.000000
iterals: 2, 5, 1    mat1[2][1] = 20.000000  mat2[1][5] = 0.000000   dest[2][5] = 0.000000
iterals: 2, 5, 2    mat1[2][2] = 0.000000   mat2[2][5] = 0.000000   dest[2][5] = 0.000000
iterals: 3, 0, 0    mat1[3][0] = 0.000000   mat2[0][0] = 0.000000   dest[3][0] = 0.000000
iterals: 3, 0, 1    mat1[3][1] = 0.000000   mat2[1][0] = 20.000000  dest[3][0] = 0.000000
iterals: 3, 0, 2    mat1[3][2] = 0.000000   mat2[2][0] = 0.000000   dest[3][0] = 0.000000
iterals: 3, 1, 0    mat1[3][0] = 0.000000   mat2[0][1] = 0.000000   dest[3][1] = 0.000000
iterals: 3, 1, 1    mat1[3][1] = 0.000000   mat2[1][1] = 0.000000   dest[3][1] = 0.000000
iterals: 3, 1, 2    mat1[3][2] = 0.000000   mat2[2][1] = 0.000000   dest[3][1] = 0.000000
iterals: 3, 2, 0    mat1[3][0] = 0.000000   mat2[0][2] = 0.000000   dest[3][2] = 0.000000
iterals: 3, 2, 1    mat1[3][1] = 0.000000   mat2[1][2] = 0.000000   dest[3][2] = 0.000000
iterals: 3, 2, 2    mat1[3][2] = 0.000000   mat2[2][2] = 0.000000   dest[3][2] = 0.000000
iterals: 3, 3, 0    mat1[3][0] = 0.000000   mat2[0][3] = 0.000000   dest[3][3] = 0.000000
iterals: 3, 3, 1    mat1[3][1] = 0.000000   mat2[1][3] = 0.000000   dest[3][3] = 0.000000
iterals: 3, 3, 2    mat1[3][2] = 0.000000   mat2[2][3] = 0.000000   dest[3][3] = 0.000000
iterals: 3, 4, 0    mat1[3][0] = 0.000000   mat2[0][4] = 0.000000   dest[3][4] = 0.000000
iterals: 3, 4, 1    mat1[3][1] = 0.000000   mat2[1][4] = 0.000000   dest[3][4] = 0.000000
iterals: 3, 4, 2    mat1[3][2] = 0.000000   mat2[2][4] = 1.000000   dest[3][4] = 0.000000
iterals: 3, 5, 0    mat1[3][0] = 0.000000   mat2[0][5] = 0.000000   dest[3][5] = 0.000000
iterals: 3, 5, 1    mat1[3][1] = 0.000000   mat2[1][5] = 0.000000   dest[3][5] = 0.000000
iterals: 3, 5, 2    mat1[3][2] = 0.000000   mat2[2][5] = 0.000000   dest[3][5] = 0.000000
iterals: 4, 0, 0    mat1[4][0] = 0.000000   mat2[0][0] = 0.000000   dest[4][0] = 0.000000
iterals: 4, 0, 1    mat1[4][1] = 0.000000   mat2[1][0] = 20.000000  dest[4][0] = 0.000000
iterals: 4, 0, 2    mat1[4][2] = 30.000000  mat2[2][0] = 0.000000   dest[4][0] = 0.000000
iterals: 4, 1, 0    mat1[4][0] = 0.000000   mat2[0][1] = 0.000000   dest[4][1] = 0.000000
iterals: 4, 1, 1    mat1[4][1] = 0.000000   mat2[1][1] = 0.000000   dest[4][1] = 0.000000
iterals: 4, 1, 2    mat1[4][2] = 30.000000  mat2[2][1] = 0.000000   dest[4][1] = 0.000000
iterals: 4, 2, 0    mat1[4][0] = 0.000000   mat2[0][2] = 0.000000   dest[4][2] = 0.000000
iterals: 4, 2, 1    mat1[4][1] = 0.000000   mat2[1][2] = 0.000000   dest[4][2] = 0.000000
iterals: 4, 2, 2    mat1[4][2] = 30.000000  mat2[2][2] = 0.000000   dest[4][2] = 0.000000
iterals: 4, 3, 0    mat1[4][0] = 0.000000   mat2[0][3] = 0.000000   dest[4][3] = 0.000000
iterals: 4, 3, 1    mat1[4][1] = 0.000000   mat2[1][3] = 0.000000   dest[4][3] = 0.000000
iterals: 4, 3, 2    mat1[4][2] = 30.000000  mat2[2][3] = 0.000000   dest[4][3] = 0.000000
iterals: 4, 4, 0    mat1[4][0] = 0.000000   mat2[0][4] = 0.000000   dest[4][4] = 0.000000
iterals: 4, 4, 1    mat1[4][1] = 0.000000   mat2[1][4] = 0.000000   dest[4][4] = 0.000000
iterals: 4, 4, 2    mat1[4][2] = 30.000000  mat2[2][4] = 0.000000   dest[4][4] = 0.000000
iterals: 4, 5, 0    mat1[4][0] = 0.000000   mat2[0][5] = 0.000000   dest[4][5] = 0.000000
iterals: 4, 5, 1    mat1[4][1] = 0.000000   mat2[1][5] = 0.000000   dest[4][5] = 0.000000
iterals: 4, 5, 2    mat1[4][2] = 30.000000  mat2[2][5] = 0.000000   dest[4][5] = 0.000000
iterals: 5, 0, 0    mat1[5][0] = 0.000000   mat2[0][0] = 0.000000   dest[5][0] = 0.000000
iterals: 5, 0, 1    mat1[5][1] = 0.000000   mat2[1][0] = 20.000000  dest[5][0] = 0.000000
iterals: 5, 0, 2    mat1[5][2] = 0.000000   mat2[2][0] = 0.000000   dest[5][0] = 0.000000
iterals: 5, 1, 0    mat1[5][0] = 0.000000   mat2[0][1] = 0.000000   dest[5][1] = 0.000000
iterals: 5, 1, 1    mat1[5][1] = 0.000000   mat2[1][1] = 0.000000   dest[5][1] = 0.000000
iterals: 5, 1, 2    mat1[5][2] = 0.000000   mat2[2][1] = 0.000000   dest[5][1] = 0.000000
iterals: 5, 2, 0    mat1[5][0] = 0.000000   mat2[0][2] = 0.000000   dest[5][2] = 0.000000
iterals: 5, 2, 1    mat1[5][1] = 0.000000   mat2[1][2] = 0.000000   dest[5][2] = 0.000000
iterals: 5, 2, 2    mat1[5][2] = 0.000000   mat2[2][2] = 0.000000   dest[5][2] = 0.000000
iterals: 5, 3, 0    mat1[5][0] = 0.000000   mat2[0][3] = 0.000000   dest[5][3] = 0.000000
iterals: 5, 3, 1    mat1[5][1] = 0.000000   mat2[1][3] = 0.000000   dest[5][3] = 0.000000
iterals: 5, 3, 2    mat1[5][2] = 0.000000   mat2[2][3] = 0.000000   dest[5][3] = 0.000000
iterals: 5, 4, 0    mat1[5][0] = 0.000000   mat2[0][4] = 0.000000   dest[5][4] = 0.000000
iterals: 5, 4, 1    mat1[5][1] = 0.000000   mat2[1][4] = 0.000000   dest[5][4] = 0.000000
iterals: 5, 4, 2    mat1[5][2] = 0.000000   mat2[2][4] = 0.000000   dest[5][4] = 0.000000
iterals: 5, 5, 0    mat1[5][0] = 0.000000   mat2[0][5] = 0.000000   dest[5][5] = 0.000000
iterals: 5, 5, 1    mat1[5][1] = 0.000000   mat2[1][5] = 0.000000   dest[5][5] = 0.000000
iterals: 5, 5, 2    mat1[5][2] = 0.000000   mat2[2][5] = 0.000000   dest[5][5] = 0.000000

Here is the source code:

#include<stdio.h>

void prod(float mat1[][6], float mat2[][6], float dest[][6], int m1, int n1, int n2) {
     printf("orders: %d, %d, %d\n", m1, n1, n2);
     int i, j, k; // kmax = n1, jmax = n2, imax = m1
     for (i = 0; i < m1; i++) {
         for (j = 0; j < n2; j++) {
             dest[i][j] = 0;
             for (k = 0; k < n1; k++) {
                 dest[i][j] += mat1[i][k]*mat2[k][j];
                 printf("iterals: %d, %d, %d\t", i, j, k);
                 printf("mat1[%d][%d] = %f\t", i, k, mat1[i][k]);
                 printf("mat2[%d][%d] = %f\t", k, j, mat2[k][j]);
                 printf("dest[%d][%d] = %f\n", i, j, dest[i][j]);
             }
         }
     }
 }


void main() {
    float res[][6] = { 0 };

    float G[][6] =  { {10,  0,  0},
                      { 0,  0,  0},
                      { 0, 20,  0},
                      { 0,  0,  0},
                      { 0,  0, 30},
                      { 0,  0,  0} };

    float H[][6] =  { {1, 0, 0, 0, 0, 0},
                      {0, 0, 1, 0, 0, 0},
                      {0, 0, 0, 0, 1, 0} };

    prod(G, H, res, 6, 3, 6);
}

Solution

  • float res[][6] = { 0 }; is a float res[1][6]; and not a float res[6][6]; as you would need. If you do not have a full initializer list, you need to write out all dimensions.

    Also void main() should be int main(void).

    Your initializer list of G also does not fit the float G[][6], it should be a float G[][3].

    Here is the full code: https://ideone.com/2hz45m