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
來檢索矩陣的行。但是,請注意,它按照將這些行數組添加到矩陣的順序遍歷這組行!如果矩陣和向量之間的順序不同,結果將會全部錯誤。所以,可能不是這樣可靠的事情,因爲它打破了很容易...
哦,你可以隨時嘗試部分展開循環(S)。
將循環外的sizeof()存儲在變量中。因爲每個循環都調用sizeof()。另外,使用++ $ i而不是$ i ++。預增量快於後增量。 – Tjoene 2013-02-27 10:21:47
如果您想要進行嚴肅的高性能算術,請選擇PHP以外的語言。從慢語言開始,就是在腳下開槍。 (你可以以某種方式從PHP調用C)。 – 2013-02-28 01:48:46
謝謝艾拉。我現在試圖橋接PHP和C/JAVA/SciLab – asleighna 2013-02-28 03:12:01