2017-02-01 6 views
0

PHPプログラムでネストループが6つありますが、スクリプトの計算時間が非常に遅いです。私は6つのループを実装し、別の言語に切り替えることを意味していても計算時間を増やすより良い方法があるかどうか尋ねたいと思います。私が実装しているアルゴリズムの性質は反復を必要とするので、どのように実装すれば良いのか分かりません。PHPのネストされたループが極端に遅い

ここにコードがあります。

<?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画像におけるすべての画素を通る本質的にコード反復

問題だと計算された行列を出力するコードのセクションであるので、私は、無関係のコードの大部分を削除しました(2次元配列)。このコードは、128x128の画像で約2秒かかります。これは、通常のイメージのため、このプログラムは非実用的にするよりも大きい128×128

+0

をあなたを助けるかもしれない、以下のリンクを参照してください、私は2秒を言うと思います4.4兆回の反復には非常に適しています。多くの機能の1つがあなたのニーズをサポートしているかどうかを見るために、「Imagick」のような図書館を見てみましたか? – Scopey

+0

どのようにその番号を取得しましたか? 128x128の行列で計算されている計算はほとんどありません。 – user4757174

+0

6つの数値を掛けました。あなたはそのような深いサイクルを構築することに間違っています。深さ3で十分です。 –

答えて

0

利用できる機能がImagickライブラリであり

Imagick::exportImagePixels 

それは http://www.php.net/manual/en/imagick.exportimagepixels.php

+0

イメージを配列に入れるのは遅い部分ではありません。それはかなり速く起こる。私は画像の2D離散コサイン変換を計算する必要があり、それは6つのループを必要とします(カスタムブロックサイズと量子化テーブルを持つライブラリがない限り) – user4757174

+0

はい2DDCのライブラリが利用できないようです Go Matlabの場合、2D DCTのスコープはさらに多くなります。 –

関連する問題