加快MATLAB运行速度的三个方法

转自:http://www.matlabfan.com/viewthread.php?tid=893&page=1&fromuid=1217#pid7449

一、 遵守Performance Acceleration的规则
二、 遵守三条规则
三、 绝招

一、 遵守Performance Acceleration的规则

1、只有使用以下数据类型,matlab才会对其加速: logical,char,int8,uint8,int16,uint16,int32,uint32,double
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structre,single,function handle,java classes,user classes,int64,uint64

2、matlab不会对超过三维的数组进行加速。

3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值来表示;b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数据类型,只使用三维以下的数组;c、循环内只调用了内建函数(build-in function)。

4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将加速运行。

5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
x = a.name; for k=1:10000, sin(A(k)), end;

6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
度。

7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
运行速度。(已验证)

二、 遵守三条规则

1、尽量避免使用循环
a、尽量用向量化的运算来代替循环操作。最常用的使用vectorizing技术的函数有:All、diff、ipermute、permute、reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cumsum、ind2sub、ndgrid、repmat、sort、sum 等。
请注意matlab文档中还有这样一句补充:“Before taking the time to
vectorize your code, read the section on Performance Acceleration.
You may be able to speed up your program by just as much using the MATLAB JIT Accelera tor instead of vectorizing.”
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
行循环次数少的,内环执行循环次数多的。这样可以显著提高速度。(已验证)

2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、ones、cell、struct、repmat等。
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
A = int8(zeros(100));换成:A = repmat(int8(0), 100, 100);(已验证)
c、当需要扩充一个变量的大小、维数时使用repmat函数。(已验证)

3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。b、使用Functions而不是Scripts 。

三、 绝招
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。

1、改用更有效的算法

2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++语言文件,VC编译”。

相关推荐
改善Matlab运行效率 一叶方舟 2012.04 1. 改善运行的技巧 1.1 分析程序的运行状况 1) Profiler工具 使用Profiler工具找到话费时间比较多的代码行的位置并优化这些代码 2) 查看运行时间的函数 tic --程序段 time=toc 3) 计算短程序运行所花费的时间 有的程序很短,运行时,速度太快,以至于使用tic和toc不能得到有用的信息,可尝试把程序放到一个循环中来计算 tic for k=1:100 --运行程序100次 end toc 1.2 循环矢量化 1) 矢量化方法 矢量化是指将for循环和while循环转换为等价的矢量或矩阵操作 2) 使用矢量化的函数 Table 1 MATLAB中使用了矢量化的函数 all diff ipermute permute reshape squeeze any find logical prod shiftdim sub2ind cumsum ind2sub ndgrid repmat sort sum 1.3 数组的内存预分配 1) 给数组预分配内存 预分配使得不必在每次数组变大时进行改变,针对不同类型的数组使用合适的预分配函数 数组类型 预分配函数 示例 数值数组 zeros y=zeros(1,100) 单元数组 cell B=cell(2,3); B{1,3}=1:3; B{2,2}=’string’; 结构数组 struct repmat data=repmat(struct(‘x’.[1 3],… ‘y’,[5 6]),1,3); 2) 给非double型矩阵预分配内存 下面的语句用zeros函数预分配一个uint8型100*100的矩阵,首先,创建一个double型满秩矩阵,然后把矩阵转换为uint8型,这将导致不必要的时间和内存花费 A=int8(zeros(100)); 使用repmat函数,只需要创建一个double值,从而减少了对内存的需求 A=repmat(int8(0),100,100); 在不能进行预分配的时候,看是否能通过repmat函数使数组变大,用repmat函数扩展矩阵时,可以获得连续的内存块 1.4 其他方法 1) 用MEX文件编写循环代码 必须使用for循环时,把它写为MEX文件,因为不必在每次运行循环中的语句时都对他们进行解释 2) 操作实型数据 MATLAB特意为实数设计了一些函数,如reallog,realpow,realsqrt等 3) 函数比脚本运行更快 4) 使用load函数和save函数比Matlab文件I/O过程更好 5) 避免大型后台处理 2. 程序运行情况监测-Profiler Profiler是一个能够检测程序运行状况的工具,它告诉你M文件中哪些代码行最花费时间,哪些行被调用的次数最多,然后就可以利用上面的方法对这些代码进行改进。 其实也可以使用Profiler理解文件,对于很长不是自己创建的M文件,或者其他不熟悉的M文件,可以使用Profiler查看M文件是如何工作的,用详细报表查看隔行的实际调用情况。 3. 使用Profile函数 Profiler的运行是基于profile函数返回的结果的,但有一些profile函数具有的特点Profiler中并没有,具体查看help 4. 有效使用内存 1) 内存管理函数 使用下面这些函数,可以帮助在Matlab中管理内存 (1) whos函数:显示给工作空间中的变量分配了多少内存 (2) pack函数:把已经存在的变量保存到磁盘,然后重新存入,这将减少因为内存碎片出问题的机会 (3) clear函数:从内存中删除变量,增加可用内存的一种方法是周期性地把不再使用的变量从内存中清楚出去 (4) save函数:有选择地把变量保存到磁盘,使用大量数据时,这是一个有用的技巧 (5) load函数:重新载入数据文件 (6) quit函数:退出matlab并返回所有分配的内存到系统中 2) 节约内存的方法 本节介绍帮助你更节约内存,并避免出现“out of memory”的错误 (1) 使用变量 • 避免创建大型临时性变量,不再需要时清楚他们 • 使用固定大小的数
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页