同样的算法和思路,不同的人写出来的程序,执行效率可能有成倍的差别。主要原因就是写代码的习惯,这里介绍点个人的小体会。
1. 向量化,少用for。很多人写Matlab代码,会沿用C语言的思路,经常用for循环逐个遍历矩阵或者向量的元素,这是造成代码执行效率低的主要原因。Matlab顾名思义就是矩阵实验室,对矩阵和向量的处理是特别优化的。在CPU的一个时钟周期里,如果导入的是向量或者矩阵,在intel的一些底层库的支持下,可以用一个指令处理一批数据,相当于是批量并行的。如果用for循环,一个时钟周期只能处理一个矩阵元素,自然慢了。比如,用find代替for循环查找向量中的某个元素。用01二值的向量做布尔运算,可以代替很多循环和if判断,速度提升非常显著。这个方法还能精简代码,增强程序的可读性。
2. 建立查找表,空间换时间。对于碰撞检测,灰度变换等操作,如果用for循环遍历的话,往往需要两层循环,计算量呈现平方量级的增长。这时候,建立查找表往往可以实现成百倍的效率提升。以灰度变换为例,最简单的就是8位的图片,建立一个256个元素的向量,把要替换的灰度填写到这个向量里。做变换的时候,直接查找就可以了。如果条件更为复杂,可以建立二维的,甚至n维的查找表。本人曾经用这个方法,把一个程序的计算时间从十分钟缩短到7秒。查找表实际上是一种空间换时间的操作,在具体应用的时候,需要权衡。一般来说,现在内存都比较大了,还是挺实用的。另外,需要说的是,这种方法会降低点程序的可读性,如果你的程序速度已经很快了,就没必要用了。
3. 少