首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >通用Matlab代码优化

通用Matlab代码优化
EN

Stack Overflow用户
提问于 2014-01-18 15:29:20
回答 1查看 344关注 0票数 0

我们知道,就时间而言,matlab for循环非常昂贵。我听到同事说尝试用矩阵运算代替for循环。换句话说,试着用内存消耗来代替时间消耗。

在以前的帖子中,我曾经问过如何使用数据自动化系统来比较元素和元素的两个矩阵。@Eric然后建议我用矩阵操作来转换我拥有的两个for loops,最后在gpu上执行这些矩阵操作。这很直观。受到这个答案的启发,我开始更认真地思考matlab代码优化。

我之所以写这篇文章,是因为我想问,是否有人能给出一些类似的直观例子,或者解释写高效matlab代码的高效编码技术?参考任何教程或一本书,这将是很好的。

谢谢你!!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-19 08:30:06

矢量环

在Matlab中,您可以通过使用向量环获得加速比。MATLAB是专为对向量和矩阵进行操作而设计的fi,因此通常对向量或矩阵执行操作比使用循环更快。例如:

代码语言:javascript
运行
复制
index=0;
for time=0:0.001:60;
    index=index+1;
    waveForm(index)=cos(time);
end;

如果以下列方式替换,运行速度将大大加快:

代码语言:javascript
运行
复制
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%。

参考资料:

  • fi程序的Pro ling、优化和加速
  • 编程模式:通过优化内存访问来最大化代码性能
  • 编写快速MATLAB代码
  • 工程师计算机概论
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21206092

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档