这是我的矩阵乘法代码。
#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]
?
答案 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};