EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、 遵守PeRFormance Acceleration的规则 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将# R; Y/ _+ |4 \
其规则总结如下7条:
$ W' q% Q, C/ V0 } C. ?1、只有使用以下数据类型,matlab才会对其加速:
: F+ L( z/ r* K1 k3 d9 R5 Hlogical,char,int8,uint8,int16,uint16,int32,uint32,double& y/ h$ A& D r& |; r$ s, [$ k
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu6 K6 m4 N" L7 k( w9 k
re,single, function handle,java classes,user classes,int64,uint64
( l$ f, S- x( X! U7 `2、matlab不会对超过三维的数组进行加速。% ` J# K; ?/ s X+ Q! L
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
% {. ?0 q; V3 u8 P- G0 d4 b4 z来表示;
2 J5 r. ]7 W# b, e* ^ Gb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
* ~9 R* N v% S$ x# z3 N2 G据类型,只使用
7 d4 ^7 \1 U8 }0 S三维以下的数组;c、循环内只调用了内建函数(build-in function)。
! {7 r$ h9 P2 A* i. L# [" B4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将6 Z5 Q5 f9 d/ g8 Q: l+ }7 ^
加速运行。( v9 Z; A& r& _. W2 B% y
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
5 W) i4 e6 h# y% z, V: cx = a.name; for k=1:10000, sin(A(k)), end;
) v5 @# f- f! T) l6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
! l& E, G9 Y% \' h度。6 E" Z3 @9 C4 X& T$ }" O" ?; F5 X
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
/ I4 d7 Y) |) p3 X: _运行速度。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 g$ {% j/ M) y& j
%%%%%%%%%%%%%%%%%%%%%%%4 }; N- d- `6 a) O+ E: M8 }: I
二、 遵守三条规则 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic% [: ^4 h0 v) _$ M; W; @% b7 ]0 O
h means it is designed for vector and matrix operations. You can often speed up your M-file c
( @: u+ m3 v# T9 Bode by using4 a( R" ], a, ~2 U
vectorizing algorithms that take advantage of this design. Vectorizati# ?1 Z/ `: U' `% @- }. E1 s6 k4 i! ~% P
on means converting
8 |" f K/ X7 Q; t ^- w- Kfor and while loops to equivalent vector or matrix operations.”。改进
6 b' P, E8 Z5 ]2 ]8 X这样的状况有两种方法: a、尽量用向量化的运算来代替循环操作。如将下面的程序: i=0;
$ I# h0 K( R$ r; r) g$ J& F8 Rfor t = 0:.01:10
- R [! `9 j- b$ b* A4 t3 gi = i+1;
, p" H; \ h: `. ?+ by(i) = sin(t);# }9 w0 U# i9 I5 Y. t. R. E( _0 ^
end$ j) |: j/ {/ T" \! z
替换为:( O' Z. b3 C+ s' W, t
t = 0:.01:10;/ V; u6 H3 f- V, s
y = sin(t);+ `" Y# B! l6 k) l1 c
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
0 }3 M6 b* H5 u5 G$ bpermute、permute、$ s# B# o/ G, y+ ?/ P0 c
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
2 m, z1 E! k. wum、ind2sub、/ y$ Y$ p6 X0 y. I
ndgrid、repmat、sort、sum 等。 请注意matlan文档中还有这样一句补充:“Before taking the time to vectorize your code, read the section on Performance Acceleration.' F: k( c2 k' F( a' @( `
You may be able to
! j; T' k* G* h- ~8 p0 mspeed up your program by just as much using the MATLAB JIT Accelera
! L2 p% ^* U' r4 G2 P1 {' O) Utor instead of
" R* ^4 w8 F! ]! xvectorizing.”。何去何从,自己把握。 b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执( K3 S0 e7 A2 X
行循环次数少的,: a+ G/ P% d. c h( B2 T
内环执行循环次数多的。这样可以显著提高速度。 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on$ V; {% y3 m4 q$ E# r1 N' w
es、cell、struct、. ]+ T7 }2 g* V9 f9 E2 R* l
repmat等。
6 k8 I5 c- U5 L2 o$ [- cb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: A = int8(zeros(100));
( z2 ]6 ~7 u& C! i/ f! ~换成:
[' o+ H; b% @) `9 uA = repmat(int8(0), 100, 100);/ |/ _+ C7 v8 n) z5 R# E
c、当需要扩充一个变量的大小、维数时使用repmat函数。 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。4 x( R8 n& b p1 z7 R$ O
b、使用Functions而不是Scripts 。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! J$ F6 _+ d- A2 F
%%%%%%%%%%%%%%%%%%%%%%%0 Y+ }+ g# a1 x2 T; u2 R2 J) G
三、 绝招 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
+ g0 [% y- C$ R. i Y4 g1、改用更有效的算法
! t8 X( W* |3 A$ q0 y; o) V2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
. @! @3 n( b0 ?3 u$ C0 O- \3、如果循环比较大的话,将循环部分改成dll调用会快50到100倍,大家试试吧
6 m! f) Q) n8 N, ? |