第一种最朴素的算法就是用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];
}
}
}
}
第二种算法用A矩阵的第i行分别与B矩阵相乘,其中B矩阵按行来访问。
例如:A矩阵的第0行 (a00, a01)第一个元素a00 与 B矩阵的第0行相乘(b00, b01, b02) 得到结果是(a00*b00, a00*b01, a00*b02)
A矩阵的第0行 (a00, a01)第二个元素a01 与 B矩阵的第1行相乘(b10, b11, b12) 得到结果是(a01*b10, a01*b11, a01*b12)
则C矩阵的第0行的结果是上面两个的和,(a00*b00+a01*b10, a00*b01+a01*b11, a00*b02+a01*b12).
同理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];
}
}
}
}
下面是对上面两个方法进行测试:
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("\n");
}
printf("\n");
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("\n");
}
}