EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、 遵守PeRFormance Acceleration的规则 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将0 h, r7 q4 ~ R) j! N
其规则总结如下7条:
6 N% I J, ?: O( P6 b1、只有使用以下数据类型,matlab才会对其加速:
i: E+ D: \% w% \/ Ylogical,char,int8,uint8,int16,uint16,int32,uint32,double' W) a$ F# O& d+ A1 S6 Z
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
% C) K2 \0 N' bre,single, function handle,java classes,user classes,int64,uint64; j. R/ y, y6 G6 @' l% |! {/ k
2、matlab不会对超过三维的数组进行加速。! K. ~& t: n1 z; V! Z& y" Q w
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
+ F* p/ O9 H2 O1 ?6 d; ^来表示;( L5 G. W; ]0 b" p* I
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数& j4 K" x1 F6 K8 ]1 W4 R: |
据类型,只使用" ~# U& m: w. y8 R9 [3 l1 T* U
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
4 X2 ?6 O0 V/ C1 g2 g4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
7 Z H2 `, D8 O* _, A. n! R加速运行。4 I; n& e8 U+ p( d9 ?" A; X
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
9 G" G4 ^6 I0 t1 {x = a.name; for k=1:10000, sin(A(k)), end;
; ^# V e8 {+ |' }# T6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
& ^% c4 i0 Q& _0 ^1 f' _度。3 @ a' {/ j1 o
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
6 a5 P7 @- x) E; ]0 R$ v1 n6 j运行速度。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%+ ?, M$ l' A- s+ K9 L" A$ q
%%%%%%%%%%%%%%%%%%%%%%%
4 n, v; f$ A- M( l1 `1 b# M二、 遵守三条规则 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
( u0 p( `$ ]/ _. \+ ?# d5 m3 [. Ih means it is designed for vector and matrix operations. You can often speed up your M-file c
& N+ y# J8 {! T+ _ode by using
7 _- W/ O3 r& ~+ U3 F& vvectorizing algorithms that take advantage of this design. Vectorizati# F, D3 P( O9 Z6 e
on means converting4 K+ ]7 |1 f9 T" J) _) K2 F# N
for and while loops to equivalent vector or matrix operations.”。改进$ \5 p/ J$ f2 a- ^- h; ]' f6 k
这样的状况有两种方法: a、尽量用向量化的运算来代替循环操作。如将下面的程序: i=0;4 j" A8 J* |% ~* k% j! g8 i
for t = 0:.01:100 o/ N; k6 s W/ Q! o/ O
i = i+1;
% i( n" I! N' z, Ey(i) = sin(t);# b/ z% z1 n# _% G1 T9 C
end, |0 j; R. o0 W3 P
替换为:
* }: {; s0 z! `$ g- R4 c9 Ht = 0:.01:10;
5 u$ ?) n6 T$ f0 t0 Wy = sin(t);
' M# Z% j0 W- c速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
9 n6 z' {; S2 c1 E$ P, Bpermute、permute、6 m2 g$ ?2 m$ N* j* V
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums1 x3 ^6 O0 t4 m/ D# _6 m8 ~
um、ind2sub、
% X3 C) e0 J# T4 R9 R8 z8 _ndgrid、repmat、sort、sum 等。 请注意matlan文档中还有这样一句补充:“Before taking the time to vectorize your code, read the section on Performance Acceleration.& J' G% A6 t& f; ^7 f0 f% D
You may be able to
2 j$ }) N6 L }( p' w7 G1 e9 v. R2 ispeed up your program by just as much using the MATLAB JIT Accelera7 C% }0 H' R7 l7 g1 l& }$ Z4 ]
tor instead of& ~* I' n: C6 I, A
vectorizing.”。何去何从,自己把握。 b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执9 E% x+ z. q1 F9 r$ U9 f5 _
行循环次数少的,
; S, n8 a4 e3 m$ B; F) o内环执行循环次数多的。这样可以显著提高速度。 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
6 Y- }0 }" [- z. f8 Ies、cell、struct、
8 L# k5 u$ u" A6 S, h( Prepmat等。$ K. m. C7 o5 E) W i9 n
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: A = int8(zeros(100));
+ O- y/ R5 K! @9 ?, i; ?换成:1 G% Y$ H* R. v3 V- b1 m
A = repmat(int8(0), 100, 100);
# w& Q) H D9 m7 lc、当需要扩充一个变量的大小、维数时使用repmat函数。 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。5 x- v8 ~6 J2 o+ M) B
b、使用Functions而不是Scripts 。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/ Z( ?& r/ {7 M7 g
%%%%%%%%%%%%%%%%%%%%%%%5 A; F |1 ?: ~5 q' [
三、 绝招 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。9 K6 @0 s4 q+ O2 r3 F `" [6 T
1、改用更有效的算法
! b4 J) c- e5 I) i) g2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。! M, O7 W4 A% |, o( P9 }
3、如果循环比较大的话,将循环部分改成dll调用会快50到100倍,大家试试吧 & e3 S$ B$ j1 E$ J: y, m
|