C程序将两个矩阵相乘
给定两个矩阵,将它们相乘的任务。矩阵可以是正方形或矩形。
例子:
Input : mat1[][] = {{1, 2},
{3, 4}}
mat2[][] = {{1, 1},
{1, 1}}
Output : {{3, 3},
{7, 7}}
Input : mat1[][] = {{2, 4},
{3, 4}}
mat2[][] = {{1, 2},
{1, 3}}
Output : {{6, 16},
{7, 18}}
平方矩阵的乘法:
下面的程序将两个大小为 4*4 的方阵相乘,我们可以将 N 更改为不同的维度。
C
// C program to multiply two square matrices.
#include
#define N 4
// This function multiplies mat1[][] and mat2[][],
// and stores the result in res[][]
void multiply(int mat1[][N], int mat2[][N], int res[][N])
{
int i, j, k;
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
res[i][j] = 0;
for (k = 0; k < N; k++)
res[i][j] += mat1[i][k] * mat2[k][j];
}
}
}
int main()
{
int mat1[N][N] = { { 1, 1, 1, 1 },
{ 2, 2, 2, 2 },
{ 3, 3, 3, 3 },
{ 4, 4, 4, 4 } };
int mat2[N][N] = { { 1, 1, 1, 1 },
{ 2, 2, 2, 2 },
{ 3, 3, 3, 3 },
{ 4, 4, 4, 4 } };
int res[N][N]; // To store result
int i, j;
multiply(mat1, mat2, res);
printf("Result matrix is
");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++)
printf("%d ", res[i][j]);
printf("
");
}
return 0;
}
C
// C program to multiply two rectangular matrices
#include
// Multiplies two matrices mat1[][] and mat2[][]
// and prints result.
// (m1) x (m2) and (n1) x (n2) are dimensions
// of given matrices.
void multiply(int m1, int m2, int mat1[][m2], int n1,
int n2, int mat2[][n2])
{
int x, i, j;
int res[m1][n2];
for (i = 0; i < m1; i++)
{
for (j = 0; j < n2; j++)
{
res[i][j] = 0;
for (x = 0; x < m2; x++)
{
*(*(res + i) + j) += *(*(mat1 + i) + x)
* *(*(mat2 + x) + j);
}
}
}
for (i = 0; i < m1; i++)
{
for (j = 0; j < n2; j++)
{
printf("%d ", *(*(res + i) + j));
}
printf("
");
}
}
// Driver code
int main()
{
int mat1[][2] = { { 2, 4 }, { 3, 4 } };
int mat2[][2] = { { 1, 2 }, { 1, 3 } };
int m1 = 2, m2 = 2, n1 = 2, n2 = 2;
// Function call
multiply(m1, m2, mat1, n1, n2, mat2);
return 0;
}
输出
Result matrix is
10 10 10 10
20 20 20 20
30 30 30 30
40 40 40 40
时间复杂度: O(n 3 )。可以使用 Strassen 的矩阵乘法进行优化
辅助空间: O(n 2 )
矩形矩阵的乘法:
我们在 C 中使用指针来乘以矩阵。请参阅以下帖子作为代码的先决条件。
如何在C中将二维数组作为参数传递?
C
// C program to multiply two rectangular matrices
#include
// Multiplies two matrices mat1[][] and mat2[][]
// and prints result.
// (m1) x (m2) and (n1) x (n2) are dimensions
// of given matrices.
void multiply(int m1, int m2, int mat1[][m2], int n1,
int n2, int mat2[][n2])
{
int x, i, j;
int res[m1][n2];
for (i = 0; i < m1; i++)
{
for (j = 0; j < n2; j++)
{
res[i][j] = 0;
for (x = 0; x < m2; x++)
{
*(*(res + i) + j) += *(*(mat1 + i) + x)
* *(*(mat2 + x) + j);
}
}
}
for (i = 0; i < m1; i++)
{
for (j = 0; j < n2; j++)
{
printf("%d ", *(*(res + i) + j));
}
printf("
");
}
}
// Driver code
int main()
{
int mat1[][2] = { { 2, 4 }, { 3, 4 } };
int mat2[][2] = { { 1, 2 }, { 1, 3 } };
int m1 = 2, m2 = 2, n1 = 2, n2 = 2;
// Function call
multiply(m1, m2, mat1, n1, n2, mat2);
return 0;
}
输出
6 16
7 18
时间复杂度: O(n 3 )。可以使用 Strassen 的矩阵乘法进行优化
辅助空间: O(m1 * n2)
有关更多详细信息,请参阅有关将两个矩阵相乘的完整文章!