如何将矩阵乘以C中的矩阵?为什么这不起作用?

时间:2014-11-01 03:39:13

标签: c arrays matrix multiplying

这是我正在进行的计划。任务是乘以2个矩阵。矩阵A中的列数与矩阵B中的行数相同。下面是对两个矩阵包含的内容以及预期结果的注释。计算结果就是我的程序。

void matrixMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C){
int k;
int l;
int j;
    for(j=0; j < ARows; j++) {
        for (l=0; l < BCols; l++) {
            for (k=0; k < ACols; k++) {
                C[j][l] += A[j][k] * B[k][l];
            }/*for*/
        }/*for*/
    }/*for*/
}/*matrixMul*/


/*This is what the output should be....
  ==> Computing 0.0   1.0   2.0      0.0   1.0   2.0
                1.0   2.0   3.0  *   3.0   4.0   5.0
                2.0   3.0   4.0      6.0   7.0   8.0

==> Expected    15.0  18.0  21.0
                24.0  30.0  36.0
                33.0  42.0  51.0

==> Computed    15.0  20.0  25.0
                28.0  36.0  44.0
                41.0  52.0  63.0 */

2 个答案:

答案 0 :(得分:3)

你的等式看起来正确。我只能猜测C在计算之前没有初始化为全零。我会这样做(只是为了确定):

for(j=0; j < ARows; j++) {
    for (l=0; l < BCols; l++) {
        C[j][l] = 0;                      // <- Init C to zero
        for (k=0; k < ACols; k++) {
            C[j][l] += A[j][k] * B[k][l];
        }
    }
}

答案 1 :(得分:3)

当矩阵C归零时,您的代码可以正常工作:

#include <stdio.h>

typedef double Matrix[3][3];

static void print_matrix(const char *tag, Matrix M);
static void matrixMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C);

void matrixMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C)
{
    int k;
    int l;
    int j;
    for (j = 0; j < ARows; j++)
    {
        for (l = 0; l < BCols; l++)
        {
            for (k = 0; k < ACols; k++)
            {
                C[j][l] += A[j][k] * B[k][l];
            }
        }
    }
}

int main(void)
{
    Matrix A = { { 0.0, 1.0, 2.0 }, { 1.0, 2.0, 3.0 }, { 2.0, 3.0, 4.0 }, };
    Matrix B = { { 0.0, 1.0, 2.0 }, { 3.0, 4.0, 5.0 }, { 6.0, 7.0, 8.0 }, };
    Matrix C = { { 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 }, { 0.0, 0.0, 0.0 }, };

    print_matrix("A", A);
    print_matrix("B", B);

    matrixMul(A, B, 3, 3, 3, C);

    print_matrix("C", C);
    return 0;
}

static void print_matrix(const char *tag, Matrix M)
{
    printf("%s:\n", tag);
    for (int i = 0; i < 3; i++)
    {
        for (int j = 0; j < 3; j++)
            printf("%6.2f", M[i][j]);
        putchar('\n');
    }
}

输出:

A:
  0.00  1.00  2.00
  1.00  2.00  3.00
  2.00  3.00  4.00
B:
  0.00  1.00  2.00
  3.00  4.00  5.00
  6.00  7.00  8.00
C:
 15.00 18.00 21.00
 24.00 30.00 36.00
 33.00 42.00 51.00

您可以轻松修复乘法函数中的代码,以便结果矩阵的初始内容无关紧要:

void matrixMul(Matrix A, Matrix B, int ARows, int ACols, int BCols, Matrix C)
{
    for (int j = 0; j < ARows; j++)
    {
        for (int l = 0; l < BCols; l++)
        {
            int sum = 0;
            for (int k = 0; k < ACols; k++)
                sum += A[j][k] * B[k][l];
            C[j][l] = sum;
        }
    }
}

一个好的优化编译器很可能会产生与本版本中基本相同的代码,C[j][l]在最内层循环中没有使用。