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] xb[0][0] a[0][0] xb[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];什么?
uj5u.com熱心網友回復:
你的誤解從這里開始:
對于矩陣乘法,它是
mul[0][0] = a[0][0] x b[0][0] a[0][0] x b[1][0]在數學中。
這不是矩陣乘法的作業原理。
如果您查看此代碼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
因此,使用kas 索引的回圈負責將 的行a與 的列相乘b。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/362835.html
