加速matlab运行的三重境界
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%: _7 N: w/ ^8 L6 D& z5 w3 ^/ p# }+ a
%%%%%%%%%%%%%%%%%%%%%%%3 M Q, L: S& W( P P
一、 遵守Performance Acceleration的规则: b2 @6 U; f$ u( D
二、 遵守三条规则
三、 绝招
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
一、 遵守Performance Acceleration的规则1 k$ j- o7 N) f% N$ u4 \7 l
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将, G& k$ L9 c4 o, |+ p, \( [
其规则总结如下7条:% K: d7 c' u' x4 w, f7 c
1、只有使用以下数据类型,matlab才会对其加速:3 K$ H7 s( l5 W8 h
logical,char,int8,uint8,int16,uint16,int32,uint32,double
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu7 U a* @9 A' M3 j
re,single,7 ~4 C; c, S) R5 }) o; \( y
function handle,java classes,user classes,int64,uint64
2、matlab不会对超过三维的数组进行加速。+ U+ ?0 I9 ^6 k3 P
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值# n5 f* Q0 {2 Y" H+ O6 I% q
来表示;
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
据类型,只使用- v7 F$ B* q. |$ x
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
加速运行。 f2 f* [- [8 m; w+ L" u
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
x = a.name; for k=1:10000, sin(A(k)), end;- ]6 o+ K1 O8 Q! O9 t6 O$ C6 {
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速5 _2 o$ P" D0 V7 w" j6 ]9 F- h
度。7 n# ]. k$ w* A1 |# P; A8 c
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低) w$ H" u h) ^- I `( x* k. c
运行速度。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%
二、 遵守三条规则
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic! I) R8 x/ i" i" Y7 {7 }4 h3 d
h means it is designed) o: i z! P3 c! C
for vector and matrix operations. You can often speed up your M-file c0 @9 z1 [9 W- Q/ |* V! K
ode by using
vectorizing algorithms that take advantage of this design. Vectorizati ^! O7 Q+ M+ H& p) N1 @
on means converting9 W( h5 s1 s3 b. K$ K
for and while loops to equivalent vector or matrix operations.”。改进
这样的状况有两种方法:/ V: y- p. t0 i% s# x
a、尽量用向量化的运算来代替循环操作。如将下面的程序:, A7 C) ]1 K& `6 Z% V! ]
i=0;
for t = 0:.01:10 Y! l* i, N( c% n
i = i+1;$ q e# H' }* H, p1 `! E
y(i) = sin(t);" e J5 o3 i2 w) A3 F$ \
end
替换为:! ` ?( J) H, k$ N0 z3 g
t = 0:.01:10;
y = sin(t);+ c0 C/ t$ [7 M7 B
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
permute、permute、
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
um、ind2sub、
ndgrid、repmat、sort、sum 等。
请注意matlan文档中还有这样一句补充:“Before taking the time to
vectorize your code, read the section on Performance Acceleration.; J# G0 a- Y' O1 u1 L/ j
You may be able to
speed up your program by just as much using the MATLAB JIT Accelera' S! i9 o8 m2 v) M: [; Z
tor instead of
vectorizing.”。何去何从,自己把握。
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执' X. h _$ R6 Y2 {/ D; ^9 l/ F
行循环次数少的,
内环执行循环次数多的。这样可以显著提高速度。2 P; h& s3 E9 @* ~& h, x& n
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
es、cell、struct、
repmat等。
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:! o, A6 l& ]' g! g$ g
A = int8(zeros(100));
换成:
A = repmat(int8(0), 100, 100);# t. P& K+ _& W& N- p% P2 R
c、当需要扩充一个变量的大小、维数时使用repmat函数。" i0 p# w* h. h
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
b、使用Functions而不是Scripts 。3 l9 D" q+ ^; U' k
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%; E+ `! t8 E9 Z
%%%%%%%%%%%%%%%%%%%%%%%
三、 绝招
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
1、改用更有效的算法: _1 ?% }5 ~/ t, M$ n' V" f
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
| 欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) | Powered by Discuz! X2.5 |