2013-05-01 101 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;