同样的算法和思路,不同的人写出来的程序,执行效率可能有成倍的差别。主要原因就是写代码的习惯,这里介绍点个人的小体会。

1. 向量化,少用for。很多人写Matlab代码,会沿用C语言的思路,经常用for循环逐个遍历矩阵或者向量的元素,这是造成代码执行效率低的主要原因。Matlab顾名思义就是矩阵实验室,对矩阵和向量的处理是特别优化的。在CPU的一个时钟周期里,如果导入的是向量或者矩阵,在intel的一些底层库的支持下,可以用一个指令处理一批数据,相当于是批量并行的。如果用for循环,一个时钟周期只能处理一个矩阵元素,自然慢了。比如,用find代替for循环查找向量中的某个元素。用01二值的向量做布尔运算,可以代替很多循环和if判断,速度提升非常显著。这个方法还能精简代码,增强程序的可读性。

2. 建立查找表,空间换时间。对于碰撞检测,灰度变换等操作,如果用for循环遍历的话,往往需要两层循环,计算量呈现平方量级的增长。这时候,建立查找表往往可以实现成百倍的效率提升。以灰度变换为例,最简单的就是8位的图片,建立一个256个元素的向量,把要替换的灰度填写到这个向量里。做变换的时候,直接查找就可以了。如果条件更为复杂,可以建立二维的,甚至n维的查找表。本人曾经用这个方法,把一个程序的计算时间从十分钟缩短到7秒。查找表实际上是一种空间换时间的操作,在具体应用的时候,需要权衡。一般来说,现在内存都比较大了,还是挺实用的。另外,需要说的是,这种方法会降低点程序的可读性,如果你的程序速度已经很快了,就没必要用了。

3. 少用全局变量global,用传递参数代替。用global确实方便,不需要传递参数了。但少写点代码的代价可能是计算时间延长。如果计算量很大的话,还是建议多写点代码。

另外,有些人喜欢把中间变量输出来,如果出现刷屏的情况,屏幕的变量不断跳动,说明输出已经严重影响到内部的计算速度了。我的经验是会降低一两倍。

说点题外的,很多人喜欢沿用C语言的习惯,循环的中间变量用i和j,这在Matlab里是非常不推荐的。因为有特殊的含义,比如5+3i,这里的i表示虚数。一般情况下,使用i和j都没问题,但就怕出现这种特殊表示,那你查起来,就费劲了,甚至会觉得出错莫名其妙。我的习惯是用m、n代替。

在判断是否相等的语句中,比如x==2,这种写法也是不推荐的。建议是2==x,因为有可能把==写成=,这样的差别是很难看出来的,而且程序根本不会报错,而是每次都返回true!出现这种错误,也是很难排查的。而如果写成2==x,如果少输入一个等号,就会报错,及时地发现这个错误。这个习惯也适合C等其他语言程序的编写。

注意细节,养成习惯,会让你的代码更加稳健,出错概率低。这样长久下去,你写程序也会越来越自信。

------------------------------

参考资料:

附送一个资料,科学网下载的。据说可以把Matlab代码,直接转成C/C++代码,正是我们需要的东西。转载本文请联系原作者获取授权,同时请注明本文来自吴景鹏科学网博客。

链接地址:http://blog.sciencenet.cn/blog-467089-617009.html

上一篇:【文化乱弹13】门钉和SCI

下一篇:60周年校庆,让我们怎么庆起来?

提升matlab效率,科学网—写Matlab程序,提高运算速度的小技巧 - 吴景鹏的博文相关推荐

  1. vc6.0能编辑html,科学网—VC6.0的18个实用小技巧 - 梁才的博文

    1.检测程序中的括号是否匹配 把光标移动到需要检测的括号(如大括号{}.方括号[].圆括号()和尖括号<>)前面,键入快捷键"Ctrl+]".如果括号匹配正确,光标就跳 ...

  2. matlab gmt,科学网—在Matlab中调用GMT画图 - 徐逸鹤的博文

    GMT(Generic Mapping Tools)是由Paul Wessel和Walter Smith开发的一款开源的绘图软件.它使用命令行生成ps或者eps文件.GMT的常用命令包括psbasem ...

  3. matlab phog,科学网—UCF 大牛 Prof. Shah 课题组代码合集 - 张重的博文

    Prof. Shah 是计算机视觉的大牛,尤其是视频中的行为识别,做的很不错,Jingen Liu就是他的学生. Source Code This code performs background m ...

  4. matlab surf颜色,科学网[转载]matlab中控制mesh或者surf的颜色

    科学网[转载]matlab中控制mesh或者surf的颜色 曲面的顏色越发柔順滑腻,del2 (Z) 根據數值微分來產生矩陣 Z 的 discrete Laplacian, Y,surf 及 mesh ...

  5. 师妹问我:有哪些新手程序员不知道的小技巧?

    阅读本文大概需要5分钟. 一个师妹问:洋哥,我今年应届毕业,刚开始写代码,不知道有没有一些新手需要注意的地方. 给了师妹一些建议之后,感觉这是个好问题!不光是新手程序员,很多小技巧小秘密恐怕老手也未必 ...

  6. 程序员装B小技巧——管理你的桌面

    程序员装B小技巧--管理你的桌面 引言 想不想拥有一个和下方截图一样简单快捷的桌面?随着工作学习的时间推移,我们电脑里面的各种软件和文档日渐增多,导致我们的桌面变得杂乱且不美观.身为一个程序员怎么能容 ...

  7. 写带有代码博客的小技巧

    又双叒叕大家都知道是什么意思吗?知道怎么读吗?它们其实是一个网络流行用语,通常读作"yòu,shuāng,ruò,zhuó".表示某事物变化更替相当频繁,也表示一件事反复出现. 还 ...

  8. 归并有效排序算法matlab,科学网—[用MATLAB写算法]之排序算法2)归并排序merge sort - 徐勇刚的博文...

    归并排序(merge sort)是一种利用分治策略(divide and conquer)进行排序的算法,算法复杂度为 $\Theta (nlog_{2}n)$ . filename: merge_s ...

  9. matlab中显示变量大小写,科学网—一些MATLAB的编程规范总结1.0版 - 何亮的博文

    好的编程习惯,可以提高编程效率,不仅可以使代码容易修改,也容易给别人看懂,便于交流.我们不仅要写出"给机器读懂的代码",也写出"给人看得懂的代码". 本文根据一 ...

最新文章

  1. 什么是静态UItableView
  2. Vivado中如何避免信号被优化掉?
  3. 表格单元格中的CSS文本溢出?
  4. 作业1--求100内的奇数。
  5. 关于JavaScript语句后面的分号
  6. 使用OpenGL实现翻书动画
  7. (一)、http原理
  8. 玩JDK 12的Switch表达式
  9. VS2010中使用gtest简单案例
  10. socket编程介绍
  11. 1067 Sort with Swap(0, i) (25 分)
  12. window7 已经分好区的硬盘如何再次分区?
  13. android 叠加视图 重启,android-后台应用程序以侦听拖动手势
  14. matlab 门限回归模型,门限回归及Stata操作汇总与空间门槛回归模型简介
  15. 软件开发实习做什么_为什么要有开发人员实习时间
  16. 新机安装指南(软件推荐)
  17. 基于Sprngboot+Vue的分布式酒店管理系统
  18. MySQL数据库课程设计_Wincc实现与数据库的交互以及报表的实现方式
  19. 使用Qt开发中国象棋(三):走棋着法列表
  20. 关于SEO与搜索引擎排名现状分析与SEO去向

热门文章

  1. 全球政府机构十大网络安全事件
  2. 6、强引用,软引用,弱引用和虚引用
  3. 我们公司使用了6年的Spring Boot项目部署方案,打包 + 一键部署,稳的一批
  4. Latex subsection出现文字重叠
  5. 获得用户输入的一段文字,将这些文字进行垂直输出
  6. Cocos Creator开发技术研究:微信小游戏中音效中断问题处理
  7. 关于Steam 教育的知识整理
  8. 材料封样信息流程指引
  9. c++gdal如何在大图像中截取小图像并获取其图像信息_CVPR2020 | 真实场景中的玻璃检测,有趣的应用...
  10. 什么是SEM?搜索引擎营销是什么?