加速matlab运行的三重境界(zz)

%%%%%%%%%%%%%%%
一、 遵守Performance Acceleration的规则
二、 遵守三条规则
三、 绝招
%%%%%%%%%%%%%%%%%
一、 遵守Performance Acceleration的规则
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
其规则总结如下7条:
1、只有使用以下数据类型,matlab才会对其加速:
logical,char,int8,uint8,int16,uint16,int32,uint32,double
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
re,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、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, which means it is designed
for vector and matrix operations. You can often speed up your M-file code by using vectorizing algorithms that take advantage of this design. Vectorization means converting for and while loops to equivalent vector or matrix operations.”。
改进这样的状况有两种方法:
a、尽量用向量化的运算来代替循环操作。如将下面的程序:
i=0;
for t = 0:.01:10
i = i+1;
y(i) = sin(t);
end
替换为:
t = 0:.01:10;
y = sin(t);
速度将会大大加快。最常用的使用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 _disibledevent=>
换成:
A = repmat(uint8(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编译”。
junziyang 2004-10-25 01:00
Re:【转贴】加速matlab运行的三重境界
以 上绝招是针对R13及以前版本的。从R14开始,Mathworks声称已经完成所有内建函数及工具箱的加速,Mex技术对提高程序运行速度已无用,其作 用只是可以增强程序的可移植性而已。我试验过,确实如此,有时甚至会出现转换后的函数运行速度反而变慢的现象!其他绝招还是有效的。
质疑中
Tags: 

延伸阅读

最新评论

发表评论