在Matrix Multiplication中解释

时间:2014-05-21 11:08:40

标签: c matrix

这是我的矩阵乘法代码。

  #include <stdio.h>
  main()
  {
     int a[10][10],b[10][10],c[10][10],m,n,o,i,j,k;
     printf("Enter rows and column for matrix: ");
     scanf("%d%d%d",&m,&n,&o);
     printf("\nEnter elements of matrix 1:\n");
     for(i=0;i<m;i++)
     {
            for(j=0;j<n;j++)
            {

                            printf("Enter elements a[%d][%d]: ",i,j);
                    scanf("%d",&a[i][j]);
            }
    }
    printf("\nEnter elements of matrix 2:\n");
    for(i=0;i<n;i++)
    {
            for(j=0;j<o;j++)
            {
                    printf("Enter elements b[%d][%d]: ",i,j);
                    scanf("%d",&b[i][j]);
            }
    }
    for(i=0;i<m;i++)
    {
            for(j=0;j<o;j++)
            {
                    c[i][j]=0;
            }
    }
    for(i=0;i<m;i++)
    {
            for(j=0;j<o;j++)
            {
                    for(k=0; k<n; ++k)
                    {
                            c[i][j]=c[i][j]+a[i][k]*b[k][j];
                    }
            }
    }
    printf("\nOutput Matrix:\n");
    for(i=0;i<m;i++)
    {
            for(j=0;j<o;j++)
            {
                    printf("%d \t\t ",c[i][j]);
            }
            printf("\n\n");
    }
}

我的问题在于矩阵乘法为什么我们将结果数组(c[i][j])初始化为0,然后还将该结果数组与两个矩阵的乘法相加c[i][j] = c[i][j]+a[i][k]*b[k][j]? 为什么我们不能直接写c[i][j] = a[i][k]*b[k][j]

3 个答案:

答案 0 :(得分:2)

您必须初始化矩阵,因为每个单元格都是一个总和。这些总和需要初始化。 初始化通常为零,因为您需要C = A * B. 您可以使用假设的D矩阵初始化C,然后您将获得C = A * B + D.

编辑:请注意,对于固定大小的矩阵(表示3x3),您可以使用更简单的表达式扩展总和,并避免初始化。 例如,A和B(和C)是3x3矩阵,你可以这样写:

for(int i=0; i<3; ++i){
    for(int j=0; j<3; ++j){
        c[i][j] = a[i][0]*b[0][j] + a[i][1]*b[1][j] + a[i][2]*b[2][j];
    }    
}

此代码不需要初始化,因为c[i][j]是从一个表达式完全定义的。

答案 1 :(得分:0)

正如Johan在下面的评论中指出的那样,你在a和b中迭代多组单元格来设置c中的单元格,并在过程中保持一个运行总计。这就是您需要继续添加现有单元格值的原因。

答案 2 :(得分:0)

您需要将c[i][j]初始化为零,因为您在该字段中累积了最内部循环的结果。

您可以将零循环集成到乘法循环中。

for(i=0;i<m;i++)
{
  for(j=0;j<o;j++)
  {
    c[i][j] = 0;
    for(k=0; k<n; ++k)
    {
      c[i][j] += a[i][k] * b[k][j];
    }
  }
}

或只是memset the region

memset(c, 0, sizeof(c));

或将其归零;

int c[10][10] = {0};