2014-09-05 58 views
1

我想從兩個文本文件中讀取矩陣,將它存儲到2個數組中,然後嘗試將這兩個矩陣相乘並將結果存儲在數組中。 乘法結果即將000.從兩個文本文件乘以兩個矩陣給出輸出爲零

下面是我的代碼

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

int main(int argc,char *argv[]) 
{ 
    FILE *fr1, *fr2, *fw; 
    char *line = malloc(1000); 
    int count = 0; 
    //To read a file use the fopen() function to open it 
    fr1 = fopen(argv[1], "r"); 
    //If the file fails to open the fopen() returns a NULL 
    if (fr1 == NULL) { 
     printf("Cannot open %s. Program terminated...",argv[1]); 
     exit(1); 
    } 

    // Similar to the above method read the second file 
    fr2 = fopen(argv[2], "r"); 
    if (fr2 == NULL) { 
     printf("Cannot open %s. Program terminated...",argv[2]); 
     exit(1); 
    } 

    double *data = (double*) malloc(1000*sizeof(double)); 
    if(data == NULL) 
    { 
     printf("Error in allocating memory"); 
     return EXIT_FAILURE; 
    } 
    // Read number of columns and number of rows of first matrix 
    getline(&line, &count, fr1); 
    int read = -1, cur = 0, columCount1 = 0; 
    while(sscanf(line+cur, "%lf%n", &data[columCount1], &read) == 1) 
    {cur+=read; columCount1++;} 

    int rowCount1 = 1; 
    while(getline(&line, &count, fr1) != -1) {rowCount1++;} 
    printf("%d\n",columCount1); 
    printf("%d\n",rowCount1); 

    // Read number of columns and number of rows of second matrix 
    getline(&line, &count, fr2); 
    read = -1,cur = 0; 
    int columCount2 = 0; 
    while(sscanf(line+cur, "%lf%n", &data[columCount2], &read) == 1) 
    {cur+=read; columCount2++;} 

    int rowCount2 = 1; 
    while(getline(&line, &count, fr2) != -1) {rowCount2++;} 
    printf("%d\n",columCount2); 
    printf("%d\n",rowCount2); 
    int i=0; 
    int j=0; 

    int **mat1 = (int **)malloc(rowCount1 * sizeof(int*)); 
    for(i = 0; i < rowCount1; i++) 
    mat1[i] = (int *)malloc(columCount1 * sizeof(int)); 

    fseek(fr1, 0, SEEK_SET); 

    for(i=0; i<rowCount1; i++) 
    { 
     for(j=0; j<columCount1; j++) 
      fscanf(fr1,"%d",&mat1[i][j]); 
    } 

    i = 0; 
    j = 0; 

    printf("\n\n"); 
    //print matrix 1 
    for(i=0; i<rowCount1; i++) 
    { 
     for(j=0; j<columCount1; j++) 
      printf("%d",mat1[i][j]); 

     printf("\n"); 
    } 

    i = 0; 
    j = 0; 
    int **mat2 = (int **)malloc(rowCount2 * sizeof(int*)); 
    for(i = 0; i < rowCount2; i++) 
     mat2[i] = (int *)malloc(columCount2 * sizeof(int)); 

    fseek(fr2, 0, SEEK_SET); 

    for(i=0; i<rowCount2; i++) 
    { 
     for(j=0; j<columCount2; j++) 
      fscanf(fr2,"%d",&mat2[i][j]); 
    } 

    i = 0; 
    j = 0; 

    printf("\n\n"); 
    //print matrix 2 
    for(i=0; i<rowCount2; i++) 
    { 
     for(j=0; j<columCount2; j++) 
      printf("%d",mat2[i][j]); 

     printf("\n"); 
    } 

    i = 0; 

    int **mat3 = (int **)malloc(rowCount1 * sizeof(int*)); 
    for(i = 0; i < rowCount1; i++) 
     mat3[i] = (int *)malloc(columCount2 * sizeof(int)); 
    i = 0; 
    j = 0; 
    int k = 0; 
    int sum = 0; 
    //multiplication of two matrices 
    for(i=0; i<rowCount1; i++) 
    { 
     for(j=0; j<columCount2; j++) 
     { 
      sum=0; 
      for(k=0; k<rowCount2; k++) 
       sum+=mat1[i][k]*mat2[k][j]; 
     } 
     mat3[i][j] = sum; 
    } 

    i = 0; 
    j = 0; 


    //print multiplication result 
    printf("\n\nResult = \n\n"); 

    for(i=0; i<rowCount1; i++) 
    { 
     for(j=0; j<columCount2; j++) 
      printf("%d",mat3[i][j]); 

     printf("\n"); 
    } 

    return 0; 
} 
+0

你很可能已經達到了檔案結尾的時候你已經閱讀足以知道行數在返回前釋放分配的內存,所以'而( !feof(fr1))''不會做太多...嘗試'fseek'回到文件的開頭。 – SleuthEye 2014-09-05 22:58:37

+0

謝謝。使用fseek解決了這個問題,但現在我得到了將兩個矩陣乘以000的結果。 – user3648814 2014-09-05 23:24:50

+2

我發現它看起來很糟糕,現在你已經取消了NetVipeC的良好編輯。也就是說,使用調試器應該可以讓你發現矩陣乘法有什麼問題(提示:當將'sum'分配給'mat3'時,'j'的值是多少?) – SleuthEye 2014-09-05 23:41:02

回答

1

1)矩陣乘法之前檢查如果矩陣1中的列數是相同的行中的矩陣編號爲2

//Check if number of col in mat1 is same as number of rows in mat2 
if(columCount1 != rowCount2) 
{ 
    puts("The number of columns in Matrix 1 is not same as the number of rows in Matrix 2"); 
    exit(1); 
} 

2)代碼的兩個矩陣的乘法:

for(i=0;i<rowCount1;i++) 
{ 
    for(j=0;j<columCount2;j++) 
    { 
     mat3[i][j]=0; 
     for(k=0;k<columCount1;k++) 
     { 
      mat3[i][j] = mat3[i][j]+mat1[i][k] * mat2[k][j]; 
     } 
    } 
} 

3)main()

/* After printing the results free the memory */ 
for(i=0; i< rowCount1; i++) 
    free(mat1[i]); 
free(mat1); 

for(i=0; i< rowCount2; i++) 
    free(mat2[i]); 
free(mat2); 

for(i=0; i< rowCount1; i++) 
    free(mat3[i]); 
free(mat3); 

free(data);