0

PHPで書かれた行列とベクトルの乗算を実行するこのコードがあります。

ここにスニペットがあります:

for($i = 0; $i < sizeof($transposed_matrix); $i++) {
            $vector[$i] = 0;
            for($j = 0; $j < sizeof($new_vector); $j++) {
                $vector[$i] += ($transposed_matrix[$i][$j] * $new_vector[$j]);
            }
        }

このコードをより速く実行する方法があるかどうか知りたいですか?

4

3 に答える 3

0

最適化の 1 つは、前にカウントすることforです。

$size = sizeof($transposed_matrix);
$size2 = sizeof($new_vector);
for($i = 0; $i < $size; $i++) {
    $vector[$i] = 0;        
    for($j = 0; $j < $size2; $j++) {
        $vector[$i] += ($transposed_matrix[$i][$j] * $new_vector[$j]);
    }
}
于 2013-02-27T10:20:33.497 に答える
0

PHP では、いくつかの重大な最適化を十分に制御することはできません。提案された改善は、巨大な行列とベクトルを乗算しない限り、おそらく比較的小さな影響しか与えません (この場合、最初から PHP を使用すべきではありません)。

サイズを事前に計算し、カウンターに事前インクリメントを使用することに加えて (Tjoene が提案したように)、次のように内部ループの合計に一時変数を使用します。

$sum = 0;
for ($j = 0; $j < $numCols; ++$j) {
    $sum += $matrix[$i][$j] * $vector[$j];
}
$vector[$i] = $sum;

これにより、正しい目的地の場所を $vector で複数回計算することを回避できます。

おそらく、使用する入れ子構造ではなく、単一のフラット配列に行列データを格納することで、最大のパフォーマンス向上を達成できます。マトリックスの行を連結するだけで、次のように単一のインデックスを使用してその要素を実行できます。

for ($i = 0, $n = 0; $i < $numRows; ++$i, ++$n)
{
    $sum = 0;
    for ($j = 0; $j < $numCols; ++$j) {
        $sum += $matrix[$n] * $vector[$j];
    }
    $vector[$i] = $sum;
}

もちろん、実際の乗算の前にこの行列レイアウトに変換する必要がない場合にのみ、速度が向上します。

マトリックスのレイアウトを変更したくない場合はforeach、外側のループで を使用してマトリックスの行を取得することで処理を高速化できます。ただし、これは、これらの行配列が行列に追加された順序で行のセットを反復することに注意してください! この順序が行列とベクトルで異なる場合、結果はすべて間違ったものになります。そのため、簡単に壊れてしまうため、おそらくそれほど信頼できることではありません...

ああ、いつでもループを部分的に展開しようとすることができます。

于 2013-02-27T23:28:07.550 に答える
0

PHP 配列は遅くなる傾向があります。これは、ハッシュ メカニズムへのオマージュです。PHP 配列のパフォーマンス。ベクトルのサイズを事前に決定する方法がある場合は、ループを展開して、配列の使用を避けることができます。コードがコード全体である場合、すべての項目が$transposed_matrix1 回しかヒットしないため、これは役に立ちません。Atze Kaputnik によって概説されている手法を$vector使用して、ヒット数を減らすことができます。$sumしたがって、配列パラメーターからローカル変数にコピーしてから、計算してからコピーし直すことになります...これは、パフォーマンスの向上を損なう以上のものです。

最終的にできることは、最適化のまったく異なる方法に切り替えることだけです。つまり、 HipHopのような JIT コンパイラーやコンパイル済み言語です。C の同じループは、10 倍から 100 倍の速度で実行される可能性が高く、そのプロセスを fork する時間は差し引かれます。

于 2013-02-28T00:00:25.140 に答える