EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
一、 遵守PeRFormance Acceleration的规则 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
7 p; P! O& e- W$ E5 N其规则总结如下7条:/ e/ [% U. @3 `
1、只有使用以下数据类型,matlab才会对其加速:" m& ~: I( Z6 A1 t6 n
logical,char,int8,uint8,int16,uint16,int32,uint32,double+ m/ O9 M7 |% V# _) z
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
2 Q9 y) M0 d+ q1 }3 P* |re,single, function handle,java classes,user classes,int64,uint64
, f/ |1 d1 t" x9 d: N- M3 F+ \2、matlab不会对超过三维的数组进行加速。2 ^& n/ g, U) s
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值" G" r9 }/ U j
来表示;
, z3 s1 O4 W+ e0 Z. V8 e# Sb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数5 c% }& Z5 b& L/ _+ f9 A! c& Z
据类型,只使用
: e& t9 T; i) z7 v" I三维以下的数组;c、循环内只调用了内建函数(build-in function)。
+ ^& ^1 p' g* a4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
; W2 Y, N1 K8 {1 ~$ C+ @加速运行。
; F8 Y w X0 ~: w& A$ |5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:. ]% Q, @( j+ M2 @
x = a.name; for k=1:10000, sin(A(k)), end;7 A: Q2 |. I) ~1 J
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
3 `( K) Z$ t7 p. `4 x" y度。
/ O% h# U7 _9 u, W( D( O' J" q7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低' x8 V- N# X; R5 n
运行速度。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 Q- @; G7 ^9 ~$ i5 O%%%%%%%%%%%%%%%%%%%%%%%; n* K6 c& e8 o! ?; ~: k0 [
二、 遵守三条规则 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
; k8 V# Z8 T; F* K5 B4 y+ `h means it is designed for vector and matrix operations. You can often speed up your M-file c! k4 D; W- z# `, U) y
ode by using
! f& }- v! A0 P R9 ]* b" M9 hvectorizing algorithms that take advantage of this design. Vectorizati
5 t" p9 b" i, {- ~9 [ Zon means converting7 n5 W, i8 v3 X h( A7 q" x
for and while loops to equivalent vector or matrix operations.”。改进
( @) x" ?: e& {( p' Q* x这样的状况有两种方法: a、尽量用向量化的运算来代替循环操作。如将下面的程序: i=0;
" z! z' j D! G2 T/ w0 o jfor t = 0:.01:10; H( V6 h' G0 S& W
i = i+1;! i" B; ^; m9 m" h0 P
y(i) = sin(t);3 ^& |! b& \9 r
end
* L# O; a- S& r( ^) ?5 J( G* D替换为:
* m% j" S; N# u; s) M# ct = 0:.01:10;
: t) u8 K2 h: b! X' \6 o' U7 j7 k2 o1 cy = sin(t);/ E% ~/ z2 Z5 ~: f V# S- c" A
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
2 v. w: H' \2 w5 e3 mpermute、permute、( f; _# C9 {3 t
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
, g/ F$ s l2 H0 c: cum、ind2sub、
; D: B, d2 W9 I) N3 L$ o2 ^ndgrid、repmat、sort、sum 等。 请注意matlan文档中还有这样一句补充:“Before taking the time to vectorize your code, read the section on Performance Acceleration.) E; H1 `) q$ j. ]/ d
You may be able to
7 S$ k0 {, e: y; A' Z& F# u0 kspeed up your program by just as much using the MATLAB JIT Accelera N% h+ z( ^5 y( n: K
tor instead of* c! J$ `) E, g- |3 O2 n
vectorizing.”。何去何从,自己把握。 b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执' ~8 R, x- o, N N0 a* T* y2 R- o
行循环次数少的,
' P% r! E" ?. Q) s8 a内环执行循环次数多的。这样可以显著提高速度。 2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
, H# v k; E( g( Wes、cell、struct、
+ \6 R5 l, L3 D; e- }; K5 L5 Prepmat等。
* y6 F4 m" ]3 y6 c6 Db、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: A = int8(zeros(100));
0 X, Y( G% e/ Z2 q% N, n! h换成:
$ d" }# X0 H3 T% [$ OA = repmat(int8(0), 100, 100);( [1 R$ h, | L- u* x
c、当需要扩充一个变量的大小、维数时使用repmat函数。 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
" T% S; k; A& T* R" ib、使用Functions而不是Scripts 。 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
. D- W8 h7 K* r( C `- N%%%%%%%%%%%%%%%%%%%%%%%
( v6 x( V& }% h% j) ]- V0 Q+ f7 ~三、 绝招 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。- ]" U7 y4 q: j+ \+ `
1、改用更有效的算法1 N+ }9 f5 q- i
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
/ C( K; L% _, ]: r3、如果循环比较大的话,将循环部分改成dll调用会快50到100倍,大家试试吧
$ ~% Z- E3 w7 ]/ X& |: ~7 [ |