マトリックス乗算の2つの実装方法


第1の最も素朴なアルゴリズムは,A行列のi行目とB行列のj列目の各要素を乗算して和を求め,C行列のi行目j列目の要素を得ることである.
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("
"); } }