|

楼主 |
发表于 2022-5-3 07:38
|
显示全部楼层
众里寻他千百度。蓦然回首,那人却在,灯火阑珊处
矩阵乘法
矩阵乘法是一种高效的算法可以把一些一维递推优化到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)。左乘:又称前乘,就是乘在左边(即乘号前),比如说,A左乘E即AE。
矩阵乘法满足结合律,但不满足交换律和约去律
一般的矩乘要结合快速幂才有效果。(基本上所有矩阵乘法都要用到快速幂的)
在计算机中,一个矩阵实际上就是一个二维数组。一个m行n列的矩阵与一个n行p列的矩阵可以相乘,得到的结果是一个m行p列的矩阵,其中的第i行第j列位置上的数为第一个矩阵第i行上的n个数与第二个矩阵第j列上的n个数对应相乘后所得的n个乘积之和。比如,下面的算式表示一个2行2列的矩阵乘以2行3列的矩阵,其结果是一个2行3列的矩阵。其中,结果矩阵的那个4(结果矩阵中第二(i)行第二(j)列)=
2(第一个矩阵第二(i)行第一列)*2(第二个矩阵中第一行第二(j)列)
+
0(第一个矩阵第二(i)行第二列)*1(第二个矩阵中第二行第二(j)列):
程序运行结果示例:
一般矩乘的代码:function mul( a , b : Tmatrix ) : Tmatrix;
var
i,j,k : longint;
c : Tmatrix;
begin
fillchar( c , sizeof( c ) , 0 );
for k:=0 to n do
for i:=0 to m do
for j:=0 to p do
begin
inc( c[ i , j ] , a[ i , k ]*b[ k , j ] );
if c[ i , j ] > ra then c[ i , j ]:=c[ i , j ] mod ra;
end;
mul:=c;
end; |
|