矩阵乘法是一种高效的算法可以把一些一维递推优化到log( n),还可以求路径方案等,所以更是是一种应用性极强的算法。矩阵,是线性代数中的基本概念之一。一个m×n的矩阵就是m×n个数排成m行n列的一个数阵。由于它把许多数据紧凑的集中到了一起,所以有时候可以简便地表示一些复杂的模型。矩阵乘法看起来很奇怪,但实际上非常有用,应用也十分广泛。
它是这样定义的,只有当矩阵
A
的列数与矩阵
B
的行数相等时
A
×
B
才有意义。一个
m
×
n
的矩阵
a(m
,
n
)左乘一个
n
×
p
的矩阵
b(n
,
p
),会得到一个
m
×
p
的矩阵
c(m
,
p
),满足
矩阵乘法满足结合律,但不满足交换律
一般的矩乘要结合快速幂才有效果。(基本上所有矩阵乘法都要用到快速幂的)
在数学中,一个矩阵说穿了就是一个二维数组。一个n行m列的矩阵可以乘以一个m行p列的矩阵,得到的结果是一个n行p列的矩阵,其中的第i行第j列位置上的数等于前一个矩阵第i行上的m个数与后一个矩阵第j列上的m个数对应相乘后所有m个乘积的和。
矩阵乘法的c语言程序:
#include<stdio.h>
float main()
{
float a[100][100],b[100][100],c[100][100];//定义三个数组,分别存储矩阵A,B,C
int m1,n1,m2,n2,i1,j1,i2,j2,i3,j3,i4,j4,k;
float s[100][100]={0};//赋值使数组s元素初值全部为零
printf("请输入矩阵A行数m1,列数n1:");//输入矩阵A行数,列数
scanf("%d,%d",&m1,&n1);
printf("请输入矩阵B行数m2,列数n2:");//输入矩阵B行数,列数
scanf("%d,%d",&m2,&n2);
printf("\n\n");//如果不可以相乘,下面将出现判断,在此换行,便于观看
if(n1!=m2)
printf("不可以相乘!!!");//判断是否可以相乘
printf("\n\n");
if((m1>100)||(n1>100))
printf("数目过多!!!");//控制矩阵A元素数量在数组容纳范围内
else
{
for(i1=1; i1<=m1; i1++)
{
for(j1=1; j1<=n1; j1++)
{
printf("a[%d][%d]=:",i1,j1);
scanf("%f",&a[i1][j1]);//输入矩阵A元素
}
}
}
printf("\n");//分隔开A,B的元素输入,便于观看
if((m2>100)||(n2>100))
printf("数目过多!!!");
else
{
for(i2=1; i2<=m2; i2++)
{
for(j2=1; j2<=n2; j2++)
{
printf("b[%d][%d]=:",i2,j2);
scanf("%f",&b[i2][j2]);//输入矩阵B元素
}
}
}
printf("矩阵A:\n");//输出矩阵A,便于观看,检验
for(i3=1; i3<=m1; i3++)
{
for(j3=1; j3<=n1; j3++)
{
printf("%f ",a[i3][j3]);
if(j3==n1)
printf("\n");
}
}
printf("\n");//与矩阵B的输出结果隔开,便于观看
printf("矩阵B:\n");//输出矩阵A,便于观看,检验
for(i4=1; i4<=m2; i4++)
{
for(j4=1; j4<=n2; j4++)
{
printf("%f ",b[i4][j4]);
if(j4==n2)
printf("\n");
}
}
printf("\n");
printf("矩阵C=A*B:\n");
for(i4=1; i4<=m1; i4++)
{
for(j4=1; j4<=n2; j4++)
{
for(k=1; k<=n1; k++)
{
s[i4][j4]=s[i4][j4]+a[i4][k]*b[k][j4];//定义矩阵乘法,相乘时,有一个指标是一样的,都用k
}
c[i4][j4]=s[i4][j4];//定义矩阵乘法
printf("%f ",c[i4][j4]);
if(j4==n2)
printf("\n");//控制在列指标到达N时换行
}
}
return 0;
}