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
在外部循环中使用来检索矩阵的行来加快速度。但是请注意,这会按照将这些行数组添加到矩阵的顺序遍历行集!如果矩阵和向量之间的顺序不同,结果将全是错误的。所以,可能不是那么可靠的事情,因为它很容易打破......
哦,你总是可以尝试部分展开循环。