Search code examples
cmatrixdynamic-memory-allocationmultiplication

Matrix multiplication in C - error values in result matrix


So I coded traditional matrix multiplication in C (I'm a beginner to C), but for some reason my result isn't correct, although I don't see any glaring errors. My input file looks like:

3 2

2 2

2 2

2 2

2 3

1 1 1

1 1 1

The 3 2 and 2 3 in the first and fifth lines represent the number of rows and columns in the subsequent matrices. The result should be a 3x3 matrix, all 4s. However, this code returns

4197299 4 4

4 4 4

-1912599044 32621 572

I'm inclined to believe this might be due to the way I declared the matrices. Instead of using malloc, I scanned the row and column values from the input file and directly instantiated the required matrices. I'm very new to C, so the concept of dynamic memory allocation isn't 100% clear yet. I could be totally off the mark, but I'm not sure. What confuses me especially is that about half of the matrix returned correct values. Why is this the case? Below is my code.

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


int main(int argc, char** argv){
  int i, j, k, row1, col1, row2, col2, temp;
  if(argc != 2){
    printf("error\n");
    exit(1);
  }

  FILE *file = fopen(argv[1], "r");
  if(file == NULL){
    printf("error\n");
    exit(1);
  }
  //MATRIX 1
  fscanf(file, " %d\t%d", &row1, &col1);
  int matrix1[row1][col1];

  for(i = 0; i<row1; i++){
    for(j=0; j<col1; j++){
      fscanf(file, "%d", &temp);
      matrix1[i][j] = temp;
    }
  }
  //MATRIX TWO
  fscanf(file, " %d\t%d", &row2, &col2);
  int matrix2[row2][col2];
  int product[row1][col2]; //DECLARING PRODUCT MATRIX
  for(i = 0; i<row2; i++){
    for(j=0; j<col2; j++){
      fscanf(file, "%d", &temp);
      matrix2[i][j] = temp;
    }
  }  
  
  for(i = 0; i<row1; i++){
    for(j = 0; j<col2; j++){
      for(k = 0; k<col1; k++){
    product[i][j] += matrix1[i][k]*matrix2[k][j]; //MULTIPLICATION STEP
      }
    }
  }

  for(i = 0; i<row1; i++){
    for(j = 0; j<col2; j++){
      printf("%d\t", product[i][j]); //PRINTING THE PRODUCT
    }
    printf("\n");
  }
  
  return 0;
}

Solution

  • for(i = 0; i<row1; i++){
        for(j = 0; j<col2; j++){
          product[i][j] = 0; // should be zero before summing
          for(k = 0; k<col1; k++){
              product[i][j] += matrix1[i][k]*matrix2[k][j]; //MULTIPLICATION STEP
          }
        }
    }