我们知道,就时间而言,matlab for loop非常昂贵。我听到同事们说要尝试用矩阵运算替换循环。换句话说,尝试用内存消耗替换时间消耗。
在之前的post中,我曾问过如何使用CUDA来逐元素地比较元素。然后@Eric建议我用矩阵运算转换两个for loops
,最后在gpu上做这些矩阵运算。这非常直观。受到这个答案的启发,我开始更认真地思考matlab代码优化。
我之所以这样做是因为我想问一下是否有人可以提供一些类似的直观示例或解释有效的编码技术来编写高效的matlab代码?参考任何教程或书籍都会很棒。
谢谢!!
答案 0 :(得分:2)
在Matlab中,您可以使用 Vectorize循环获得加速。 MATLAB专门设计用于矢量和矩阵,因此通常可以更快地对矢量或矩阵执行操作,而不是使用循环。例如:
index=0;
for time=0:0.001:60;
index=index+1;
waveForm(index)=cos(time);
end;
如果替换为:,运行速度会快得多
time=0:0.001:60;
waveForm=cos(time);
在使用向量运算代替循环时,您可能会发现有用的函数包括:
any()
- 如果任何元素非零,则返回true
。size()
- 返回一个向量,其中包含每个维度中数组中元素的数量。find()
- 返回任何非零元素的索引。要自己获取非零值,您可以使用a(find(a));
。cumsum()
- 返回一个包含其参数向量中元素累积总和的向量,例如cumsum([0:5])
返回[0 1 3 6 10 15]
。sum()
- 返回向量中所有元素的总和,例如sum([0:5])
返回15
。除了用矩阵运算替换for
- 循环外,您还可以通过优化内存访问来最大化代码性能:
在循环中创建或重复修改数组时,请始终事先分配数组。在这三种技术中,这种熟悉的技术可以带来最大的性能提升。
代码段2比机器A上的段1减少99.8%的时间(快580倍),比机器B上的段1减少99.7%的时间(快475倍)。
处理2-D或N-D阵列时,请在列中访问您的数据并将其存储,以便列可以轻松访问。
代码段2的执行时间比机器A上的段1少33%,比机器B上的段1少55%。
在创建作为现有数据集功能的新变量或变量时,请确保它们对算法至关重要,尤其是在数据集很大的情况下。
代码段2的执行时间比机器A上的代码段1少40%,而机器B上的时间减少96%。
代码段4的执行时间比机器A上的代码段3少40%,而机器B上的时间减少59%。
<强>参考文献:强>