マトリックス乗算の2つの実装方法
第1の最も素朴なアルゴリズムは,A行列のi行目とB行列のj列目の各要素を乗算して和を求め,C行列のi行目j列目の要素を得ることである.
第2のアルゴリズムは、A行列の第i行をそれぞれB行列に乗算し、ここで、B行列は行でアクセスする.
例えば、A行列の0行目(a 00,a 01)の1番目の要素a 00とB行列の0行目に乗算(b 00,b 01,b 02)した結果、(a 00*b 00,a 00*b 01,a 00*b 02)
A行列の0行目(a 00,a 01)の2番目の要素a 01とB行列の1行目に乗算(b 10,b 11,b 12)した結果、(a 01*b 10,a 01*b 11,a 01*b 12)
C行列の0行目の結果は、上の2つの和である(a 00*b 00+a 01*b 10,a 00*b 01+a 01*b 11,a 00*b 02+a 01*b 12).
同理C行列の1行目と2行目も同様に計算する.
次の2つの方法をテストします.
void MatrixMulMatrix_Solution1(int matrix1[][2], int m, int matrix2[][3], int n, int result[][3])
{
int i, j, k;
if (matrix1 == NULL || matrix2 == NULL || result == NULL || m <= 0 || n <= 0 || n != 2 )
{
return;
}
for (i = 0; i < m; i++)
{
for (j = 0; j < 3; j++)
{
result[i][j] = 0;
for (k = 0; k < 2; k++)
{
result[i][j] += matrix1[i][k] * matrix2[k][j];
}
}
}
}
第2のアルゴリズムは、A行列の第i行をそれぞれB行列に乗算し、ここで、B行列は行でアクセスする.
例えば、A行列の0行目(a 00,a 01)の1番目の要素a 00とB行列の0行目に乗算(b 00,b 01,b 02)した結果、(a 00*b 00,a 00*b 01,a 00*b 02)
A行列の0行目(a 00,a 01)の2番目の要素a 01とB行列の1行目に乗算(b 10,b 11,b 12)した結果、(a 01*b 10,a 01*b 11,a 01*b 12)
C行列の0行目の結果は、上の2つの和である(a 00*b 00+a 01*b 10,a 00*b 01+a 01*b 11,a 00*b 02+a 01*b 12).
同理C行列の1行目と2行目も同様に計算する.
void MatrixMulMatrix_Solution2(int matrix1[][2], int m, int matrix2[][3], int n, int result[][3])
{
int i, j, k;
if (matrix1 == NULL || matrix2 == NULL || result == NULL || m <= 0 || n <= 0 || n != 2 )
{
return;
}
memset(result, 0, sizeof(int) * m * 3);
for (i = 0; i < m; i++)
{
for (j = 0; j < 2; j++)
{
for (k = 0; k < 3; k++)
{
result[i][k] += matrix1[i][j] * matrix2[j][k];
}
}
}
}
次の2つの方法をテストします.
int main()
{
int matrix1[3][2] = { 1, 2, 3, 4, 5, 6,};
int matrix2[2][3] = { 1, 2, 3, 4, 5, 6,};
int matrix3[3][3];
int i, j;
MatrixMulMatrix_Solution1(matrix1, 3, matrix2, 2, matrix3);
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d ", matrix3[i][j]);
}
printf("
");
}
printf("
");
MatrixMulMatrix_Solution2(matrix1, 3, matrix2, 2, matrix3);
for (i = 0; i < 3; i++)
{
for (j = 0; j < 3; j++)
{
printf("%d ", matrix3[i][j]);
}
printf("
");
}
}