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
、外側のループで を使用してマトリックスの行を取得することで処理を高速化できます。ただし、これは、これらの行配列が行列に追加された順序で行のセットを反復することに注意してください! この順序が行列とベクトルで異なる場合、結果はすべて間違ったものになります。そのため、簡単に壊れてしまうため、おそらくそれほど信頼できることではありません...
ああ、いつでもループを部分的に展開しようとすることができます。