0

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);
}
Ravi Mali
  • 56
  • 1
  • 6

3 Answers3

2

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

mch
  • 9,424
  • 2
  • 28
  • 42
  • @suvojit_007 this should answer your question: https://stackoverflow.com/q/18446686/3684343 . in short: under normal conditions yes. – mch Oct 23 '18 at 06:53
  • @mch Why is **mat2[1][0]** element value is changing to 20.00? – Ravi Mali Oct 23 '18 at 07:56
  • Your `res` array was too small, so you were writing out of bounds and overwrote something else. This invokes undefined behaviour and so weird results can occur. Is the result here https://ideone.com/2hz45m as expected? – mch Oct 23 '18 at 08:05
1

Aside from float res[][6] = { 0 }; is too small, which others @mch, @Rishikesh Raje have said, other problems exists.


Consider mat1[][6], mat2[][6], dest[][6] as mat1[a][b], mat2[b][c], dest[a][c] for clearer and more flexible code.

In C99 and optionally in C11, a parameter may be a variable length array - VLA, which simplifies coding.
See Passing a multidimensional variable length array to a function

void prod(int a, int b, int c, float mat1[a][b], float mat2[b][c], float dest[a][c]) {
  printf("orders: %d, %d, %d\n", a, b, c);
  for (int ai = 0; ai < a; ai++) {
    for (int ci = 0; ci < c; ci++) {
      float sum = 0.0;
      for (int bi = 0; bi < b; bi++) {
        sum += mat1[ai][bi] * mat2[bi][ci];
        printf("iterals: %d, %d, %d\t", ai, ci, bi);
        printf("mat1[%d][%d] = %2g\t", ai, bi, mat1[ai][bi]);
        printf("mat2[%d][%d] = %2g\t", bi, ci, mat2[bi][ai]);
        printf("dest[%d][%d] = %2g\n", ai, ci, sum);
      }
      dest[ai][ci] = sum;
    }
  }
}

#define A 6
#define B 3
#define C 6

int main(void) {
  float g[A][B] = { //
      {10, 0, 0}, //
      {0, 0, 0}, //
      {0, 20, 0}, //
      {0, 0, 0}, //
      {0, 0, 30}, //
      {0, 0, 0}};
  float h[B][C] = { // Note dimension change
      {1, 0, 0, 0, 0, 0}, //
      {0, 0, 1, 0, 0, 0}, //
      {0, 0, 0, 0, 1, 0}};
  float res[A][C]; // Note dimension change

  prod(A, B, C, g, h, res);
}
chux - Reinstate Monica
  • 143,097
  • 13
  • 135
  • 256
0
  1. Your G matrix does not have 6 columns. It has 3 columns and should be defined as below

    float G[][3]
    
  2. The result matrix needs a size.

     float res[6][6] = { 0 };
    
  3. You should define main as int main(void)

  4. The function definition shall also change as below.

    void prod(float mat1[][3], float mat2[][6], float dest[][6], int m1, int n1, int n2) {
    
Rishikesh Raje
  • 8,556
  • 2
  • 16
  • 31