如何用C中的矩阵乘以矩阵?为什么';这不管用吗?

如何用C中的矩阵乘以矩阵?为什么';这不管用吗?,c,arrays,matrix,multiplication,C,Arrays,Matrix,Multiplication,这是我正在做的节目。任务是将两个矩阵相乘。矩阵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++) {

这是我正在做的节目。任务是将两个矩阵相乘。矩阵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 */
void matrixMul(矩阵A、矩阵B、int ARows、int ACols、int BCols、矩阵C){
int k;
int l;
int j;
对于(j=0;j计算0.0 1.0 2.0 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
==>预期为15.0 18.0 21.0
24.0  30.0  36.0
33.0  42.0  51.0
==>计算15.0 20.0 25.0
28.0  36.0  44.0
41.0  52.0  63.0 */

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

(j=0;j{ 对于(l=0;lC[j][l]=0;//你的方程看起来不错。我只能猜测,
C
在计算之前没有初始化为全零。我会这样做(只是为了确保):

(j=0;j{ 对于(l=0;lC[j][l]=0;//当矩阵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');
    }
}
您可以轻松地修复乘法函数中的代码,从而使结果矩阵的初始内容无关紧要:

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;
        }
    }
}
void matrixMul(矩阵A、矩阵B、int ARows、int ACols、int BCols、矩阵C)
{
对于(int j=0;j

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

当矩阵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');
    }
}
您可以轻松地修复乘法函数中的代码,从而使结果矩阵的初始内容无关紧要:

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;
        }
    }
}
void matrixMul(矩阵A、矩阵B、int ARows、int ACols、int BCols、矩阵C)
{
对于(int j=0;j

一个好的优化编译器很有可能生成与本版本中使用
C[j][l]时基本相同的代码
不在最里面的循环中使用。

欢迎使用堆栈溢出。请尽快阅读本页。矩阵的类型是什么?
能否显示打印出两个矩阵的代码?在开始添加矩阵之前,是否将矩阵C设置为零?请查看如何创建MCVE()或SSCCE()-两个名称和链接代表相同的基本理念。在中间的循环中,您是否尝试添加
c[l][k]=0
,在最里面的循环开始之前。然后会发生什么?而且,似乎你在矩阵中玩的不是整数,也请详细说明这一点。@nIcEcOw:我认为添加
C[j][l是正确的=0;
在第三个嵌套循环之前。欢迎使用堆栈溢出。请尽快阅读此页。矩阵的类型是什么?
?能否显示打印出两个矩阵的代码?在开始添加之前是否将矩阵C设置为零?请查看如何创建MCVE()或SSCCE()-两个名称和链接代表相同的基本理念。在中间的循环中,您是否尝试添加
c[l][k]=0
,在最里面的循环开始之前。然后会发生什么?而且,似乎你在矩阵中玩的不是整数,也请详细说明这一点。@nIcEcOw:我认为在第三个嵌套循环之前添加
C[j][l]=0;
是正确的。