我在PHP程序中有6个嵌套循环,但是,脚本的计算时间非常慢。我想问一下,如果有更好的方法来实现6个循环并增加计算时间,即使它意味着切换到另一种语言。我实现的算法的性质需要迭代,所以我不知道如何更好地实现它。
这是代码。
<?php
$time1 = microtime(true);
$res = 16;
$imageres = 128;
for($x=0;$x<$imageres;++$x){
for($y=0;$y<$imageres;++$y){
$pixels[$x][$y]=1;
}};
$quantizermatrix = 1;
$scalingcoefficient = 1/($res/2);
for($currentimagex=0;$currentimagex<($res*($imageres/$res-1)+1);$currentimagex = $currentimagex +$res){
for($currentimagey=0;$currentimagey<($res*($imageres/$res-1)+1);$currentimagey = $currentimagey +$res){
for($u=0;$u<$res;++$u){
for($v=0;$v<$res;++$v){
for($x=0;$x<$res;++$x){
for($y=0;$y<$res;++$y){
if($u == 0) {$a = 1/(sqrt(2));} else{$a = 1;};
if($v == 0){$b = 1/(sqrt(2));}else{$b = 1;};
$xes[$y] = $pixels[$x+$currentimagex][$y+$currentimagey]*cos((M_PI/$res)*($x+0.5)*$u)*cos( M_PI/$res*($y+0.5)*$v);
}
$xes1[$x] = array_sum($xes);
}
$xes2= array_sum($xes1)*$scalingcoefficient*$a*$b;
$dctarray[$u+$currentimagex][$v+$currentimagey] = round($xes2/$quantizermatrix)*$quantizermatrix;
}}}};
foreach($dctarray as $dct){
foreach($dct as $dc){
echo $dc." ";
}
echo "<br>";}
$time2 = microtime(true);echo 'script execution time: ' . ($time2 - $time1);
?>
我删除了大部分与此无关的代码,因为这是代码中有问题的部分
本质上,代码遍历PNG图像中的每个像素并输出计算矩阵(2d数组)。对于128x128图像,此代码大约需要2秒钟。这使得该程序对于大于128x128的普通图像不实用
答案 0 :(得分:0)
Imagick
库中有一个功能
Imagick::exportImagePixels
请参阅以下链接,它可能会帮助您 http://www.php.net/manual/en/imagick.exportimagepixels.php