|
今日,某同学来问,矩阵相乘如何利用程序求解?
本人对此颇感兴趣,遂设计一程序求解.
假如矩阵A=[1,2,3;4,5,6;7,8,9],矩阵B=[1,2,3;4,5,6;7,8,9],求AB
对于
[a[0][0] a[0][1] a[0][2]]
A=[a[1][0] a[1][1] a[1][2]]
[a[2][0] a[2][1] a[2][2]]
[b[0][0] b[0][1] b[0][2]]
B=[b[1][0] b[1][1] b[1][2]]
[b[2][0] b[2][1] b[2][2]]
有
[a[0][0]b[0][0]+a[0][1]b[1][0]+a[0][2]b[2][0] a[0][0]b[0][1]+a[0][1]b[1][1]+a[0][2]b[2][1] a[0][0]b[0][2]+a[0][1]b[1][2]+a[0][2]b[2][2]]
C=AB= [a[1][0]b[0][0]+a[1][1]b[1][0]+a[1][2]b[2][0] a[1][0]b[0][1]+a[1][1]b[1][1]+a[1][2]b[2][1] a[1][0]b[0][2]+a[1][1]b[1][2]+a[1][2]b[2][2]]
[a[2][0]b[0][0]+a[2][1]b[1][0]+a[2][2]b[2][0] a[2][0]b[0][1]+a[2][1]b[1][1]+a[2][2]b[2][1] a[2][0]b[0][2]+a[2][1]b[1][2]+a[2][2]b[2][2]]
仔细观察,发现可以借助中介矩阵mid实现矩阵相乘.
利用mid,可以间接存储a[0][0]b[0][0]、a[0][1]b[1][0]、a[0][2]b[2][0]等元素,简化计算
而且,仔细观察,a[0][0]b[0][0]+a[0][1]b[1][0]+a[0][2]b[2][0]恰好是c[0][0]的值.
同样,c[0][1]到c[2][2]也能这样求出.
mid数组需要几维呢?
如果仅用两维,则显然,mid不够用,因为这样计算下去,要存储3×3×3=27个数,且a[][]、b[][]的变化并不同步.
因此,应用三维的mid数组作为中介.
令mid[k][j]=A[k][j]*B[j]
从外到里,k为第一级循环,j为第二级,i为第三级
循环限是0-number,i/j/k++
这样,就可以echo出mid的各项
然后,对mid有关项进行加和,c[k]=SUM(k,i,number),从外到内先循环i再循环j,0-number,i/j++;
在SUM(k,i,number)函数中,定义sum的初值为0,以0-number对j循环,sum=sum+mid[k][j]
最后把c[k]换成c[j],逐个echo,得到C=[c[j]]
完事,大功告成!
测试地址:http://www.jprailfan.com/Array.php |
|