找回密码
 加入我们
搜索
查看: 2143|回复: 1

PHP版矩阵相乘

[复制链接]
发表于 2015-3-14 14:30 | 显示全部楼层 |阅读模式
今日,某同学来问,矩阵相乘如何利用程序求解?
本人对此颇感兴趣,遂设计一程序求解.
假如矩阵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
 楼主| 发表于 2015-3-14 14:31 | 显示全部楼层
发个代码
<?
//矩阵相乘 By Raicho 2015年3月14日
$number=3;
$martrixA=array(array(1,2,3),array(4,5,6),array(7,8,9));
$martrixB=array(array(1,2,3),array(4,5,6),array(7,8,9));
for ($k=0;$k<$number;$k++){
        for ($j=0;$j<$number;$j++){
                for ($i=0;$i<$number;$i++)
                {
                $mid[$k][$j][$i]=$martrixA[$k][$j]*$martrixB[$j][$i];
                }
}
}
for ($k=0;$k<$number;$k++){
        for ($j=0;$j<$number;$j++){
                for ($i=0;$i<$number;$i++)
                {
                        echo("mid[$k][$j][$i]=".$mid[$k][$j][$i]."<br>");}
                }
                echo("<br>");
                }

function sum($k,$i,$number){
        global $mid;
        $sum=0;
        for($j=0;$j<$number;$j++){
                $sum=$sum+$mid[$k][$j][$i];}
        return $sum;}

for($k=0;$k<$number;$k++){
for($i=0;$i<$number;$i++){       
$martrixC[$k][$i]=sum($k,$i,$number);
}
}
for($i=0;$i<$number;$i++){
        for($j=0;$j<$number;$j++){
        echo("martrixC[$i][$j]=".$martrixC[$i][$j]."<br>");
        }
        }
?>
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

Archiver|手机版|小黑屋|黄河铁路网

GMT+8, 2024-4-29 04:33 , Processed in 0.038690 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表