k如何在C中的矩阵乘法中工作?
How does k work in Matrix Multiplication in C?
k 在下面的代码中是如何工作的?
# include <stdio.h>
# define R 2
# define C 2
int main(void)
{
int a[R][C], b[R][C], mul[R][C], i, j, k;
for (i = 0; i < R; ++i)
for (j = 0; j < C; ++j)
{
scanf_s("%d", &a[i][j]);
}
for (i = 0; i < R; ++i)
for (j = 0; j < C; ++j)
{
scanf_s("%d", &b[i][j]);
}
for (i = 0; i < R; ++i)
for (j = 0; j < C; ++j)
{
mul[i][j] = 0;
for (k = 0; k < C; ++k)
{
mul[i][j] += a[i][k] * b[k][j];
}
printf("%d", mul[i][j]);
if (j == 0)
{
printf(" ");
}
else if (i == 0 && j == 1)
{
printf("\n");
}
}
return 0;
}
对于矩阵加法,我知道在数学 sum[0][0] = a[0][0] + b[0][0] 和代码中也是这样。
对于矩阵乘法,就是mul[0][0] = a[0][0] x b[0][0] + a[0][0] x b[1] [0] 数学。
然而在代码中,[ ] 不仅来自 i 和 j,还来自 k。
scanf_s("%d", &a[i][j]);
和 scanf_s("%d", &b[i][j]);
表明 %d 保存在内存 a[i][j] 和 b[i][j].
那么,k在mul[i][j] = a[i][k] * b[k][j];
中读到了什么?
你的误解从这里开始:
For matrix multiplication, it is mul[0][0] = a[0][0] x b[0][0] + a[0][0] x b[1][0]
in math.
那是不是矩阵乘法的工作方式。
如果您查看 i == 0
和 j == 0
以及 C == 2
的代码
mul[i][j] = 0;
for (k = 0; k < C; ++k)
{
mul[i][j] += a[i][k] * b[k][j];
}
变成
mul[0][0] = 0;
for (k = 0; k < 2; ++k)
{
mul[0][0] += a[0][k] * b[k][0];
}
由于 k
将采用值 0
和 1
,因此结果为
mul[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0];
^ ^ ^ ^
k = 0 k = 1
如您所见,这与您的预期不同。在 2X2 矩阵的情况下,这是乘法的正确方法。
如果它是 3X3 矩阵,它将是:
mul[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0];
^ ^ ^ ^ ^ ^
k = 0 k = 1 k = 2
因此使用 k
作为索引的循环负责将 a
中的一行与 b
中的一列相乘。
k 在下面的代码中是如何工作的?
# include <stdio.h>
# define R 2
# define C 2
int main(void)
{
int a[R][C], b[R][C], mul[R][C], i, j, k;
for (i = 0; i < R; ++i)
for (j = 0; j < C; ++j)
{
scanf_s("%d", &a[i][j]);
}
for (i = 0; i < R; ++i)
for (j = 0; j < C; ++j)
{
scanf_s("%d", &b[i][j]);
}
for (i = 0; i < R; ++i)
for (j = 0; j < C; ++j)
{
mul[i][j] = 0;
for (k = 0; k < C; ++k)
{
mul[i][j] += a[i][k] * b[k][j];
}
printf("%d", mul[i][j]);
if (j == 0)
{
printf(" ");
}
else if (i == 0 && j == 1)
{
printf("\n");
}
}
return 0;
}
对于矩阵加法,我知道在数学 sum[0][0] = a[0][0] + b[0][0] 和代码中也是这样。
对于矩阵乘法,就是mul[0][0] = a[0][0] x b[0][0] + a[0][0] x b[1] [0] 数学。
然而在代码中,[ ] 不仅来自 i 和 j,还来自 k。
scanf_s("%d", &a[i][j]);
和 scanf_s("%d", &b[i][j]);
表明 %d 保存在内存 a[i][j] 和 b[i][j].
那么,k在mul[i][j] = a[i][k] * b[k][j];
中读到了什么?
你的误解从这里开始:
For matrix multiplication, it is
mul[0][0] = a[0][0] x b[0][0] + a[0][0] x b[1][0]
in math.
那是不是矩阵乘法的工作方式。
如果您查看 i == 0
和 j == 0
以及 C == 2
mul[i][j] = 0;
for (k = 0; k < C; ++k)
{
mul[i][j] += a[i][k] * b[k][j];
}
变成
mul[0][0] = 0;
for (k = 0; k < 2; ++k)
{
mul[0][0] += a[0][k] * b[k][0];
}
由于 k
将采用值 0
和 1
,因此结果为
mul[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0];
^ ^ ^ ^
k = 0 k = 1
如您所见,这与您的预期不同。在 2X2 矩阵的情况下,这是乘法的正确方法。
如果它是 3X3 矩阵,它将是:
mul[0][0] = a[0][0] * b[0][0] + a[0][1] * b[1][0] + a[0][2] * b[2][0];
^ ^ ^ ^ ^ ^
k = 0 k = 1 k = 2
因此使用 k
作为索引的循环负责将 a
中的一行与 b
中的一列相乘。