EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、 遵守PeRFormance Acceleration的规则 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
: s* H" d' x y! s* t1 P# }" O其规则总结如下7条:( X# U% \6 B: A
1、只有使用以下数据类型,matlab才会对其加速:
, c0 o# _- q1 `& g' glogical,char,int8,uint8,int16,uint16,int32,uint32,double
6 [1 W, i$ K$ D, f/ |$ r而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
d. o' R! h0 W# Ure,single, function handle,java classes,user classes,int64,uint64
, s0 _: e! M0 o% ^5 \* g( Z! H7 U2、matlab不会对超过三维的数组进行加速。
! E2 X, O9 C% t7 Z$ `1 r3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值+ ]2 S' E" Y4 O- ?9 J7 M
来表示;
% d' L0 ]) V7 V( L! [- [# f7 g- {5 |b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
0 [& h; i7 _; B- F- |据类型,只使用+ A) q7 n0 b8 f
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
$ V5 G& l6 }+ ?5 [# k( R( `- h4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
6 M( P' ]$ H5 T( O加速运行。
6 }6 @+ \4 H5 t" O/ j5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
& u# y+ h# t& ux = a.name; for k=1:10000, sin(A(k)), end;
, f) a# _$ z% h* w$ @6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
4 \2 i1 A4 k. w0 x& j. _度。
" \7 B4 Z% j) t# \7 C# E7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低8 d Y0 [* j4 B/ u2 {
运行速度。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
' H7 i, c& A6 a9 Z! I8 l3 C! K%%%%%%%%%%%%%%%%%%%%%%%6 l9 n6 |, e3 g) w5 S
二、 遵守三条规则 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
, y- P7 e0 E) u; F8 zh means it is designed for vector and matrix operations. You can often speed up your M-file c0 o- j0 @: w7 Z0 {- p9 L
ode by using e7 @4 l5 A# {4 T% y G1 q: o
vectorizing algorithms that take advantage of this design. Vectorizati
* ^5 @" p, F: y0 v- {; j& z* k& g4 Ton means converting
: \& @3 j- x* h, q: x; A9 v) Lfor and while loops to equivalent vector or matrix operations.”。改进
i! t# F' f+ B+ ^. z7 h* b% b- B! b4 R这样的状况有两种方法: a、尽量用向量化的运算来代替循环操作。如将下面的程序: i=0;8 `2 i) c2 {/ s6 V4 j" l( I% M6 c4 p
for t = 0:.01:10
6 H Q( n, F* o9 h0 }6 s5 Oi = i+1;0 ?' Y! K& |% G
y(i) = sin(t);
- m# J4 h, n* }! C3 Nend* w& g7 R: ~" }' Z* [
替换为:
! t4 M5 g- K3 I2 Yt = 0:.01:10;* n- }, ~; H8 T" u/ j( [# K5 ~
y = sin(t);4 `1 W+ j% ~1 s: y
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i' I6 @# p/ `5 J/ T( x+ ]5 y( O& a0 P
permute、permute、8 t. ]; a5 [% ~, @" q0 V
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
2 G3 q$ _3 l) F, d4 u mum、ind2sub、
) F! C" P" u! B$ o+ Q8 e; H7 ?ndgrid、repmat、sort、sum 等。 请注意matlan文档中还有这样一句补充:“Before taking the time to vectorize your code, read the section on Performance Acceleration.
( l; [# h/ Q) c2 r4 U' F$ a4 A4 CYou may be able to! J: K% Z0 R3 h% ]0 {- Z
speed up your program by just as much using the MATLAB JIT Accelera" {' Y; ~8 u: Y2 L: ^8 u( f
tor instead of
/ ~6 o2 E+ h# _+ ^( k3 H2 Bvectorizing.”。何去何从,自己把握。 b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执7 G3 e& D1 D, L$ ^; x4 \. b, W
行循环次数少的,% V0 \7 m+ J# ~3 }7 l: o( X% Q
内环执行循环次数多的。这样可以显著提高速度。 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on2 B4 F$ s% K, h) c0 E2 n/ v& _1 ^
es、cell、struct、6 R, [, j( k( I. [7 F4 p: a' U
repmat等。
2 ~/ T+ h( ]+ N I1 cb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: A = int8(zeros(100));4 Z! c1 C( \: u" {4 I; x7 x/ K
换成:
3 _) j7 K% @) g& z. X8 {A = repmat(int8(0), 100, 100);9 N2 G9 L4 M8 C! t# z @
c、当需要扩充一个变量的大小、维数时使用repmat函数。 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。, j c x- x7 j* H6 k. s
b、使用Functions而不是Scripts 。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 H4 L2 v+ Q" q6 t7 i' Z% I
%%%%%%%%%%%%%%%%%%%%%%%
u, f+ ~5 E% c三、 绝招 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。! e, b$ _: r$ S0 z: O: ~- H, E
1、改用更有效的算法+ x( v. g0 S0 u, X; t
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。, H2 C0 Q, z* _: w' b4 @3 h4 X
3、如果循环比较大的话,将循环部分改成dll调用会快50到100倍,大家试试吧
+ c; o+ v1 \, k |