我们知道,就时间而言,matlab for循环非常昂贵。我听到同事说尝试用矩阵运算代替for循环。换句话说,试着用内存消耗来代替时间消耗。
在以前的帖子中,我曾经问过如何使用数据自动化系统来比较元素和元素的两个矩阵。@Eric然后建议我用矩阵操作来转换我拥有的两个for loops
,最后在gpu上执行这些矩阵操作。这很直观。受到这个答案的启发,我开始更认真地思考matlab代码优化。
我之所以写这篇文章,是因为我想问,是否有人能给出一些类似的直观例子,或者解释写高效matlab代码的高效编码技术?参考任何教程或一本书,这将是很好的。
谢谢你!!
发布于 2014-01-19 08:30:06
矢量环
在Matlab中,您可以通过使用向量环获得加速比。MATLAB是专为对向量和矩阵进行操作而设计的fi,因此通常对向量或矩阵执行操作比使用循环更快。例如:
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
-loops之外,还可以通过优化内存访问来最大化代码性能:
1.在循环中访问数组之前预先分配数组
在循环中创建或重复修改数组时,始终要事先分配数组。在所有三种技术中,这种熟悉的技术可以带来最大的性能改进。
代码段2的执行时间比机器A上的段1短99.8% (580倍),在99.7%的时间(比机器B上的段1快475倍)内执行。
2.在列中存储和访问数据
当处理2-D或and数组时,访问列中的数据并将其存储起来,这样就可以方便地被列访问。
代码段2的执行时间比机器A上的段1少33%,比机器B上的段1少55%。
3.避免创建不必要的变量
在创建作为现有数据集函数的新变量或变量时,请确保这些变量或变量对于算法至关重要,特别是在数据集较大时。
代码段2的执行时间比机器A上的代码段1短40%,在机器B上的执行时间少96%。
代码段4的执行时间比机器A上的代码段3少40%,在机器B上执行的时间少59%。
参考资料:
https://stackoverflow.com/questions/21206092
复制相似问题