参考: 《C程序设计》(夏宝岚) P78
6.10 求两个矩阵的乘积矩阵。
#include <stdio.h>
int main()
{
int a[100][100] = {{1, 0, 3, -1}, {2, 1, 0, 2}};
int b[100][100] = {{4, 1, 0}, {-1, 1, 3}, {2, 0, 1}, {1, 3, 4}};
int c[100][100] = {{0}};
int n = 2; /* 第一矩阵的行数 */
int m = 4; /* 第一矩阵的列数,即第二矩阵的行数 */
int p = 3; /* 乘积矩阵的列数 */
int i, j, k;
for (i = 0; i < n; i++)
{
for (j = 0; j < p; j++)
{
c[i][j] = 0;
for (k = 0; k < m; k++)
c[i][j] = c[i][j] + a[i][k] * b[k][j];
printf("%5d", c[i][j]);
}
printf("\n");
}
return 0;
}
运行结果:
===================
9 -2 -1
9 9 11
===================
★ 只有当一个矩阵(左矩阵)的列数等于第二个矩阵(右矩阵)的行数时, 两个矩阵才能相乘。得到的乘积矩阵行数为第一个矩阵的行数, 列数为第二个矩阵的列数。
★ 矩阵的相乘规则如下:
┌ a11 a12 a13 ┐
A =│ │
└ a21 a22 a23 ┘
┌ b11 b12 ┐
B =│ b21 b22 │
└ b31 b32 ┘
┌ a11b11+a12b21+a13b31 a11b12+a12b22+a13b32 ┐
AB =│ │
└ a21b11+a22b21+a23b31 a21b12+a22b22+a23b32 ┘
上述程序中两个矩阵的维数分别为 n × m,m×p,所得乘积矩阵为 n×p 。若要交互输入原矩阵,则改写如下:
#include <stdio.h>
int main()
{
int a[100][100], b[100][100], c[100][100];
int n, m, p; /* n×m, m×p */
int i, j, k;
printf("Input value of n, m, p\n");
scanf("%d %d %d", &n, &m, &p);
printf("\nA:\n");
for (i = 0; i < n; i++) /* 读取矩阵A的各元素 */
for (j = 0; j < m; j++)
scanf("%d", &a[i][j]);
printf("\nB:\n");
for (i = 0; i < m; i++) /* 读取矩阵A的各元素 */
for (j = 0; j < p; j++)
scanf("%d", &b[i][j]);
printf("\nAB:\n");
for (i = 0; i < n; i++) /* 求矩阵C的各元素 */
{
for (j = 0; j < p; j++)
{
c[i][j] = 0;
for (k = 0; k < m; k++)
c[i][j] = c[i][j] + a[i][k] * b[k][j];
printf("%5d", c[i][j]);
}
printf("\n");
}
return 0;
}
运行结果:
=========================
Input value of n, m, p
2 4 3↙
A:
1 0 3 -1↙
2 1 0 2↙
B:
4 1 0↙
-1 1 3↙
2 0 1↙
1 3 4↙
AB:
9 -2 -1
9 9 11
==========================
★ 搞懂矩阵相乘的原理,就可以对以前的一个问题进行补充了, 详见 [047] 求传递闭包。
评论