向量化编程

Matlab向量化编程,是matlab语言的精髓所在,向量化编程运用好了,可以从代码的运行效率明显改善中获得成功的快乐。
传统的流行观点大致如下:

1. 尽管避免循环的使用,多使用Matlab的内置函数;
----如果程序存在大量的循环~呵呵。mex,与C/C++混合编程就有了用武之地。
===============================================
额~~!! 高版本Matlab对循环结构的优化
Matlab引进了JIT(just in time)技术 和 加速器(accelerator)!!So,循环体本身已经不是程序性能提高的瓶颈了。

首先介绍一下profiler的用处——通过Profiler工具或profile函数,可以获取每行代码的运行情况,包括运行时间和调用次数等,因而知道哪些语句行花费的时间最多,可以集中精力进行改进。

(关于Profiler的介绍和使用心得 )

http://www.cadcaecam.com/forum.php?mod=viewthread&tid=25684


!关于该用循环还是向量化,这是一个比较复杂的问题,哈哈!
===========================================================

2. 能用逻辑索引解决的就不用数值索引;
---MATLAB的矩阵元素索引有两类:一类是数值索引,另一类是逻辑索引。前者又可以分为线性索引和下标索引。就运行效率来说,逻辑索引要高于数值索引(why?)
     A = rand(1000);
     tic; B = A( find(A>0.3 & A<0.7) ); toc;
     tic; C = A( (A>0.3 & A<0.7) ); toc;


3. 使用变量前养成预分配内存的习惯;
---??怎么分

4. 向量化计算代替逐点计算;
5. 能用普通数值数组完成的工作,尽量不用Cell型数组;
6. 如果矩阵含有大量0元素,尽量采用稀疏矩阵来提高运算速度和减少存储空间。





=====选择循环还是向量化,建议如下:
1. 凡是涉及矩阵运算的时候,则尽量用向量化;
-----这是因为,向量化编程Matlab语言的精髓,如果不熟悉其向量化编程的方法,则相当于没掌握这门语言。Matlab以矩阵为核心,Matlab卓越的矩阵计算能力是建立在LAPACK算法包和BLAS线性代数算法包的基础之上的。这两个算法包里的程序都是由世界上多个顶尖专家并经过高度优化的程序。

2. 如果向量化可能导致超大型矩阵的产生,使用前要慎重;
-----向量化操作获得的高效率很多时候是以空间换时间实现的。

3. 向量化的使用要灵活,多分析其运行机制,并与循环做对比;

4. Matlab初学者要尽量多用向量化思路编程

1)不能把Matlab当成C/C++等语言来使用;
2)Matlab初学者一定要提醒自己,处处想尽办法矢量化编程,而暂时先不管矢量化后会不会得到性能大幅提高或者应不应该向量化。这是因为,只有当你充分熟悉MATLAB语言特点并且熟悉其最常用的内置函数之后才能灵活运用向量化和非向量化。向量化编程往往需要程序编写者熟悉MATLAB的 常用内置函数、常用技巧,并且在向量化一个程序的过程中,能有效 锻炼其观察、分析、概括、抽象、归纳的能力



5.  高效的编程包括高效的开发和高效的运行
----我们应该明白自己的程序目的是要干什么。 以后还用吗? 


============提高代码效率的方法:
2.3.4 减少无谓损耗 --- 给一些函数‘瘦身’
      编程者必须清楚,在MATLAB程序完成一个特定任务时,哪些是完成这个特定任务必须执行的代码,哪些是不必须的。举例来说:
       MATLAB自身以及工具箱里的很多函数具有较广的通用性,所为通用性是你添加必要的代码后,能处理你当前具体的问题。 如此,对于每个具体的问题,代码实际上都有冗余。如果我们的程序某些部分对通用性要求不高,那么在优化程序时就可以考虑将不必要的代码去掉,这样的结果就是重写一些简单的函数,轻装上阵。
------当然,要权衡瘦身的难度和获得的效率提升程序。
------解决自己面对的问题,首先要知道可以使用哪些函数呀~~呵呵。


2.3.5 变‘勤拿少取’为‘少拿多取’
在MATLAB中,函数调用都要有一定的开销,这种开销一般是built-in(如sin, zeros)为最低,其次是一般的M文件,即 工具箱里能看到源代码的那些M函数以及用户自己写的M文件、子函数、nested function、匿名函数等。上面这些函数类型总的来说调用开销都比较小,而调用开销最大的是inline函数类型。

函数调用开销对于一些简单的计算来说,往往是相当大的,即使是使用built-in函数类型。
--------其思想就是一次多拿一些数据,然后慢慢处理;而不要每次都调用函数处理小数据。考虑调用的开销!


2.4 应用高版本向量化函数提高开发效率
   从MATLAB7.0开始,陆续增加了一些向量化函数,使用这些函数可以减少很多循环的使用,在保证代码运行效率的前提下,使代码更加简洁。需要说明的是,很多情况下,使用这些函数其运行效率并不必恰当使用循环快多少,使用它们主要是为了 提高开发效率,使代码更加简洁
accumarray,  arrayfun,  bsxfun,  cellfunspfun, structfun
----arrayfun这个built-in函数实现的是: 将指定的函数 应用到 给定数组包括结构数组在内的 所有元素上。
这样很多以前不可避免的循环现在可以向量化了。

你可能感兴趣的:(向量化编程)