EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、 遵守PeRFormance Acceleration的规则 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将* ?, q \9 _, u& d
其规则总结如下7条: V( ]+ K3 X% f" x5 y, M' S
1、只有使用以下数据类型,matlab才会对其加速:% s8 `( A q. T9 B/ q' h% X
logical,char,int8,uint8,int16,uint16,int32,uint32,double
7 w+ }( o1 ]# O% H% v. a而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
8 W4 X3 ~" T3 T, }re,single, function handle,java classes,user classes,int64,uint64
9 E- z3 P0 H+ w2、matlab不会对超过三维的数组进行加速。
3 Y. _+ G3 w" y p2 H" V+ N3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值" q* I0 L0 G. h5 T
来表示;
: m1 f4 q( a% z+ Y, bb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数, p+ i5 s/ B" A5 a8 V- N5 r
据类型,只使用# ?/ t, P* c+ h0 N
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
# m9 G5 e v( Q4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将7 l# t$ M% ^4 g: I6 d
加速运行。
7 `( k: V7 H. i8 f5 D5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:* }/ @7 U* q. N- c
x = a.name; for k=1:10000, sin(A(k)), end;
: M | i9 D2 T* z8 s6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速) s0 J* o% ]; x+ U! B1 Y# {
度。
3 U1 |. z$ T8 f3 W# W. B' q7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低6 h4 M1 t# g0 O
运行速度。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 n9 F! ]) y; M2 Y. B8 a%%%%%%%%%%%%%%%%%%%%%%%& |; d& a. t1 f& o3 [. E/ W
二、 遵守三条规则 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic9 V3 G/ e3 V( s, e; e' b, F- t8 P/ U
h means it is designed for vector and matrix operations. You can often speed up your M-file c" E7 c3 v$ Q ?9 F7 x1 M$ f
ode by using$ Z7 Q7 B. O* J4 g" ~' s! b# b: V
vectorizing algorithms that take advantage of this design. Vectorizati/ I( V; {9 X+ n4 E0 F
on means converting
1 `" O- e2 B- I# f9 afor and while loops to equivalent vector or matrix operations.”。改进0 Y S, i! @) n* I) T
这样的状况有两种方法: a、尽量用向量化的运算来代替循环操作。如将下面的程序: i=0;
2 y8 B2 B8 t5 M4 T: H' G' jfor t = 0:.01:101 o: U# k6 y0 J- P3 C) Z6 ~
i = i+1;1 k5 D# U9 v8 ?% x5 @. z4 k
y(i) = sin(t);; {$ f6 \; _/ F, m
end8 L5 M& @6 U$ I& m7 k2 K
替换为:
( S' B2 L. L# a X. W# it = 0:.01:10;' T! \$ Q. l+ a1 O C- b; G4 U
y = sin(t);! t6 E. I3 U3 O/ E5 L
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i: V5 m' D3 r* x5 [; G
permute、permute、2 r. _; W5 E: ~4 [) K( K3 F" O
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
$ O# W' B" ?* F4 o/ Yum、ind2sub、
/ O1 E3 E% @8 c/ Dndgrid、repmat、sort、sum 等。 请注意matlan文档中还有这样一句补充:“Before taking the time to vectorize your code, read the section on Performance Acceleration.: m# j( O) J1 P; F
You may be able to3 _- ~8 T* }' ^; ]7 {3 S. T
speed up your program by just as much using the MATLAB JIT Accelera
) e! c+ b7 n! n& `3 ktor instead of
0 r! e& ]$ P5 s xvectorizing.”。何去何从,自己把握。 b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执$ K% V. [7 I& p! u/ R! B
行循环次数少的,
( J; m& ^8 i# w2 a, e% Y1 U5 M: j内环执行循环次数多的。这样可以显著提高速度。 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on2 [4 Y: r5 Z' H# V: V0 [% M) t' T
es、cell、struct、
$ ?: h" z" R. H9 g1 L: brepmat等。
: H# m% U& u; Y3 z8 T2 zb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: A = int8(zeros(100));
- L5 T: ]0 @5 j9 d换成:8 ?2 |7 b; U! N* C; S# Q8 a' h
A = repmat(int8(0), 100, 100);- O1 W8 @4 i( P
c、当需要扩充一个变量的大小、维数时使用repmat函数。 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。/ Y: C% V1 s5 ~7 ^' i
b、使用Functions而不是Scripts 。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
, l3 W- L9 c$ X2 i% \$ R5 ]%%%%%%%%%%%%%%%%%%%%%%%) |. z0 V' z5 I1 S% K) g% R
三、 绝招 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
, ]' E+ T% H' I; ~4 u7 t$ h# U1、改用更有效的算法% m& ~" z8 }* K
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
! _. y$ S' C! X0 r3、如果循环比较大的话,将循环部分改成dll调用会快50到100倍,大家试试吧 , V% p R# v' o4 m; q
|