矩阵相乘最重要的方法是一般矩阵乘积。它只有在第一个矩阵的列数(column)和第二个矩阵的行数(row)相同时才有意义。一般单指矩阵乘积时,指的便是一般矩阵乘积。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。
设A为
的矩阵,B为
的矩阵,那么称
的矩阵C为矩阵A与B的乘积,记作
,其中矩阵C中的第
行第
列元素可以表示为:
![一个简单的矩阵乘法计算器 一个简单的矩阵乘法计算器](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzI0Ni8zMjVlMGY0MTBjMmUzYTJlODU5MmE2MTY0YzhjMDMzNi5wbmc%3D.png?w=700)
![一个简单的矩阵乘法计算器 一个简单的矩阵乘法计算器](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE1NC8yMzE4Nzc5NTFmN2FjNmZkNjQ5OWY3MWJiODllMzVlMi5wbmc%3D.png?w=700)
![一个简单的矩阵乘法计算器 一个简单的矩阵乘法计算器](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzE3Mi9jYjEwNjI2ZTZmZWRlNWM2MTJmNjE4Y2Y4NDA1NDRiNC5wbmc%3D.png?w=700)
![一个简单的矩阵乘法计算器 一个简单的矩阵乘法计算器](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzQ1Mi82MzI5NzQ0MjI2MjhkNDcxY2ZjNjM4OGZhNWRkYjlmYy5wbmc%3D.png?w=700)
![一个简单的矩阵乘法计算器 一个简单的矩阵乘法计算器](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzgzMC8zMGE1ZjNmM2ExMmE0Mzk0ZWQ0YjUyMGEzOTYzNDhhNi5wbmc%3D.png?w=700)
![一个简单的矩阵乘法计算器 一个简单的矩阵乘法计算器](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzg3Mi9jMGQ0MTI1ZDAyN2QzZjQzZWI5M2YwZTU1MjFhYjdmOC5wbmc%3D.png?w=700)
![一个简单的矩阵乘法计算器 一个简单的矩阵乘法计算器](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzM2L2MwZDlkODY2ZTg3Mjk1NzBjNmQ4M2E1YzNhNmZiNmZjLnBuZw%3D%3D.png?w=700)
如下所示:
![一个简单的矩阵乘法计算器 一个简单的矩阵乘法计算器](https://image.shishitao.com:8440/aHR0cHM6Ly9waWFuc2hlbi5jb20vaW1hZ2VzLzY0OC8zOTU0OGViOTEyNGI4MTE0OWY1MDczNTBjYzM5YThhMC5wbmc%3D.png?w=700)
#include <stdio.h>
#include <stdlib.h>#include <conio.h> //包含函数getch的定义及原型
#define M 100 //第一个矩阵的行数
#define S 100 //第一个矩阵的列数以及第二个矩阵的行数
#define N 100 //第二个矩阵的列数
int main()
{
int i,j,k;
int m,s,n;
double a[M][S],b[S][N],c[M][N]; //定义三个二维数组分别储存第一个、第二个矩阵以及它们的乘积矩阵,选择double型可以实现小数运算
while(1) //使程序永远进行
{
system("cls"); //清屏,方便下一次的计算
printf("请输入矩阵A行数:");
scanf("%d",&m);
printf("请输入矩阵A列数:");
scanf("%d",&s);
printf("请输入矩阵B列数:");
scanf("%d",&n);
printf("请输入矩阵A:\n");
for(i=0; i<m; i++) //循环输入矩阵的各行各列
{
printf("第%d行:",i+1); //i+1将物理序号转化为逻辑序号
for(k=0; k<s; k++)
scanf("%lf",&a[i][k]);
}
printf("请输入矩阵B:\n");
for(k=0; k<s; k++)
{
printf("第%d行:",k+1);
for(j=0; j<n; j++)
scanf("%lf",&b[k][j]);
}
printf("AB矩阵积C为:\n");
for(i=0; i<m; i++) //结果矩阵共m行
{
for(j=0; j<n; j++) //结果矩阵共n列
{
c[i][j]=0; //初始化结果的每一个元素
for(k=0; k<s; k++) //对应元素的乘积需要相加的次数
c[i][j]+=a[i][k]*b[k][j];//由矩阵乘法的定义将前一个矩阵的一行各元素乘以后一个矩阵的对应一列的各元素后求它们的和
printf("%16.2f",c[i][j]); //输出保留两位小数
}
printf("\n"); //结果的一行输出后换行
}
getch(); //输入任意键后清屏,重新开始
system("cls");
}
return 0;
}
程序运行如下: