EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、 遵守PeRFormance Acceleration的规则 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
; n; U: ^, s" Y" l其规则总结如下7条:
6 f+ i' h% [ w( I5 w* B1 d1、只有使用以下数据类型,matlab才会对其加速:& R; J4 ^" O; F8 y9 Y7 H$ X, V
logical,char,int8,uint8,int16,uint16,int32,uint32,double6 K' \9 N$ t1 e" z+ } z
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu4 f- j+ L9 E5 Y ~5 v
re,single, function handle,java classes,user classes,int64,uint641 m5 R/ Y: N/ } G
2、matlab不会对超过三维的数组进行加速。8 C R# b4 z! g. _
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
+ r; r3 \4 S/ [: K) o5 B$ r来表示;
+ M8 I5 W3 o Y I' ib、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
* ^ B1 X" ?. P; q% E7 A据类型,只使用# Z2 ?* d* o7 B; J; O& @- I
三维以下的数组;c、循环内只调用了内建函数(build-in function)。$ ^9 D2 u" e& g% v
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将0 \( d U$ y7 P! C9 z3 o8 H' I3 \
加速运行。8 ?8 \, d1 K1 Q% `; k
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
4 V3 [# Y3 Q" @, o5 U( l/ a" \8 Lx = a.name; for k=1:10000, sin(A(k)), end;, {! [) s1 j! b1 u" T6 ~
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
- o+ H( c: e+ J; r度。
. C$ j- O3 Q4 o9 b1 t7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
1 c; u* m+ h! {4 \) g运行速度。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
- j2 u& M0 y+ A5 Q' i' `. I; D%%%%%%%%%%%%%%%%%%%%%%%
# q7 t4 W+ E- \二、 遵守三条规则 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
; r( k3 ]+ e& A/ \h means it is designed for vector and matrix operations. You can often speed up your M-file c
& y$ G( J% R% k/ n# Q' E- lode by using
0 R1 m0 v* L/ v$ A* t* Gvectorizing algorithms that take advantage of this design. Vectorizati* Z' V( b4 L5 n
on means converting3 }. a: l4 ^. y: J) V; C
for and while loops to equivalent vector or matrix operations.”。改进: L0 ^& A# [; N1 y1 N
这样的状况有两种方法: a、尽量用向量化的运算来代替循环操作。如将下面的程序: i=0;( s# ?$ g# y+ U3 `" k
for t = 0:.01:10
9 _2 f3 J* q3 E( ]' A% C7 @& o' ui = i+1;9 M& N' {5 [) S+ A$ F
y(i) = sin(t);
; `1 O; m8 l6 V; d" uend% R9 g( a' k5 W7 X" t5 ^0 d
替换为:
1 N) ]" t7 Q. @t = 0:.01:10;
4 q# l9 E) _. g! }% `2 C( jy = sin(t);
0 Z6 V5 q$ t$ J; q8 n& K5 q速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
6 H) U/ Y- H+ Ypermute、permute、
( y5 N1 ^+ w/ r, f% G6 @reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums L6 }. I) Y2 @4 y
um、ind2sub、
0 _$ o3 T @6 hndgrid、repmat、sort、sum 等。 请注意matlan文档中还有这样一句补充:“Before taking the time to vectorize your code, read the section on Performance Acceleration.
# }% O! f* j) r9 m& t% }0 sYou may be able to9 t6 O1 O# V8 D" j
speed up your program by just as much using the MATLAB JIT Accelera
9 U' p- ~2 [3 s: U: j! `8 \tor instead of
6 K) w" ?+ \6 ]8 X, A! mvectorizing.”。何去何从,自己把握。 b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执3 f7 O4 \* Z$ ^8 E
行循环次数少的,
, c% w- F" X! i% W; |3 e* G内环执行循环次数多的。这样可以显著提高速度。 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
) b8 ^- E+ n, n8 b P* Les、cell、struct、
4 O& g& L/ _# ~repmat等。
: \. q$ m+ L' `0 j! t& S# y6 Mb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: A = int8(zeros(100));8 O, e# M! W6 c( f# {9 ~
换成:
7 x: {2 u4 u& Y4 N0 mA = repmat(int8(0), 100, 100);
' p8 ?3 ?7 N6 r) i$ dc、当需要扩充一个变量的大小、维数时使用repmat函数。 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
5 V( O# _/ _1 q0 c* b3 Ob、使用Functions而不是Scripts 。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%3 w( l3 u4 ^- J! X3 H) Z' Q) n4 J' u
%%%%%%%%%%%%%%%%%%%%%%%
& l' ^( K7 ]. V三、 绝招 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。; \9 Q1 l/ \6 M
1、改用更有效的算法
) j+ w7 y( k6 D/ v; j2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。1 q$ n2 N. d; {; c: w0 F; r, Z
3、如果循环比较大的话,将循环部分改成dll调用会快50到100倍,大家试试吧 7 j+ _& T! s- a7 m! |8 w! U
|