2013-05-01 24 views
-2

我一直在嘗試在C中進行基本的矩陣計算,但將兩個矩陣相乘總是返回0的值。在閱讀了其他有類似問題的人之後,我仍然不明白爲什麼會發生這種情況。下面是乘法功能:C中的矩陣乘法總是返回0?

double** MatrixMultiplication(double** matrixA, double** matrixB, 
           int sizeXA, int sizeYA, int sizeXB, int sizeYB) 
{ 
    double** matrixC = MatrixAllocate(sizeXA, sizeYB); 
    for (int i = 0; i < sizeXA; i++) { 
     for (int j = 0; j < sizeYB; j++) { 
      for (int k = 0; k < sizeXA; k++) { 
       matrixC[i][j] += matrixA[i][k] * matrixB[k][j]; 
      } 
     } 
    } 
    return matrixC; 
} 

而這是爲MatrixAllocate功能的代碼:

double** MatrixAllocate(int sizeX, int sizeY) { 
    double **matrix; 
    matrix = (double**)malloc(sizeX*sizeof(double*)); 
    for (int i = 0; i < sizeX; i++) 
     matrix[i] = (double*)malloc(sizeY*sizeof(double)); 

    for (int i = 0; i < sizeX; i++) { 
     for (int j = 0; j < sizeY; j++) { 
      matrix[i][j] = 0; 
     } 
    } 
    return matrix; 
} 

兩個矩陣matrixA和MatrixB由用戶填充,並且印刷時,他們有非零數據。

+0

返回值0意味着,該矩陣具有所有成員0,或者MatrixMultiplication的matrixC輸出爲NULL? – 2013-05-01 14:55:20

+1

這裏有個bug:'for(int k = 0; k 2013-05-01 14:58:13

+0

您不需要在C程序中投射'malloc'的返回值。 – 2013-05-01 15:03:33

回答

1

其他的東西是你的問題,因爲這對我來說工作得很好。注意我已經稍微修改了我的版本。 (變更方法的名稱,因爲唯一的類與資本開始,添加在矩陣生成控制初始值不是全部爲0的種子進行測試的能力)

輸出如預期爲:


行[0]:0 1 2
行[1]:3 4 5
行[2]:6 7 8
酒吧
行[0]:0 1 2
行[1]:3 4 5
行[2]:6 7 8
RES
行[0]:15 19 23
行[1]:45 58 71
行[2]:75 97 119

源是:

#include <iostream> 
#include <malloc.h> 
#include <stdio.h> 

/* Replace this method with a printf version for C compatibility*/ 
void print(double **mat, int x, int y) 
{ 
    int r, c; 
    for (r = 0; r < x; r++) { 
    std::cout << "Row [" << r << "]: "; 
    for (c = 0; c < y; c++) { 
     std::cout << mat[r][c] << " "; 
    } 
    std::cout << std::endl; 
    } 
} 

void del(double **mat, int x) 
{ 
    int r = 0; 
    for (r = 0; r < x; r++) { 
     free(mat[r]); 
    } 
    free(mat); 
} 

double** createMatrix(int sizeX, int sizeY, int val=0) 
{ 

    double **matrix; 
    matrix = (double **)malloc(sizeX * sizeof(double *)); 
    int i = 0; 
    for (i = 0; i < sizeX; i++) { 
    matrix[i] = (double *)malloc(sizeY * sizeof(double)); 
    int j = 0; 
    for (j = 0; j < sizeY; j++) { 
     if (val == 0) { 
     matrix[i][j] = 0; 
     } 
     else { 
     matrix[i][j] = i * sizeY + j; 
     } 
    } 
    } 
    return matrix; 
} 

double **multiply(double **a, double **b, int xa, int ya, int xb, int yb) 
{ 
    if (ya != xb) { 
    printf("Can't multiply incompatible matrices\n"); 
    return NULL; 
    } 

    double **c = createMatrix(xa, yb, 1); 
    int i,j,k; 
    for (i = 0; i < xa; i++) { 
    for (j = 0; j < yb; j++) { 
     for (k = 0; k < xb; k++) { 
     c[i][j] += a[i][k] * b[k][j]; 
     } 
    } 
    } 
    return c; 
} 

int main(int argc, char *argv[]) 
{ 
    double **foo = createMatrix(3, 3); 
    double **bar = createMatrix(3, 3); 
    double **res = NULL; 

    printf("Foo: \n"); 
    print(foo, 3, 3); 
    printf("Bar: \n"); 
    print(bar, 3, 3); 

    res = multiply(foo, bar, 3, 3, 3, 3); 
    printf("Res: \n"); 

    if (res) { 
    print(res, 3, 3); 
    del(res, 3); 
    } 
    else { 
    printf("Couldn't multiply see earlier error message!\n"); 
    } 

    del(foo, 3); 
    del(bar, 3); 

    return 0; 
} 
+0

+1爲一個完整的程序。但是,您可以使用OP的語言編寫解決方案嗎? – pmg 2013-05-01 15:34:16

+0

我很欣賞這種情緒和理解(這就是爲什麼我沒有使用真正的C++功能)。我所做的唯一一件非C的事情是打印方法,這不是問題的核心。雖然C99引入了對bool的支持,但我會更新該部分。如果其他人想編輯我的打印方法,以使用printf,這對我來說是潔淨的。我只是沒有使用printf的年齡。我會讓剩下的準備就緒。 – UpAndAdam 2013-05-01 15:45:21

1

校驗矩陣A和矩陣B的列長度的行長度是矩陣A的乘法和B.

+0

謝謝sepideh在想這個,但最初忘了它,你的帖子提醒我將它合併到我的代碼中。 – UpAndAdam 2013-05-01 15:54:23

+0

+1我要說的是!歡迎來到SO! – 2013-05-02 00:17:04

0

面前一律平等,這可能是方便有你MatrixAllocate返回一個單位矩陣而不是零矩陣。爲此,將環路有效負載更改爲

  matrix[i][j] = i==j? 1: 0;