|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
* |% Q5 m1 |. h& P2 d" p$ L: g标 题: 加速matlab运行的三重境界
/ `# W5 q* X1 x8 [+ `0 b# ]发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004), G8 ]' F/ o* O4 Z8 J/ _
& g; W, ~% P. c加速matlab运行的三重境界
3 ]7 o/ S% o: E
" Y; v. a, V6 W+ R, ^8 e一、 遵守Performance Acceleration的规则$ P8 b+ o) t b1 R% W- T
, }! N# s+ w4 r3 t3 J( \关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将9 H" o X3 s E6 x4 _: K+ p
其规则总结如下7条:& d9 u$ S3 `8 x5 F2 @' ^
1、只有使用以下数据类型,matlab才会对其加速:
5 Z& T/ S4 l& d/ p9 ~2 w5 t$ clogical,char,int8,uint8,int16,uint16,int32,uint32,double
, N0 U& q8 `& }. j' o而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
+ t; d) @4 [- u: I. tre,single,
. t7 _7 z" a- G! Y F2 j9 u
+ W; _3 h8 e0 _- j# p2 L' [function handle,java classes,user classes,int64,uint64
: D& w& o0 V7 }. H! r8 b1 d2、matlab不会对超过三维的数组进行加速。
1 x5 G* I) J& |9 f. _! P3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
/ L" k8 T( ] o; j来表示;
* k/ ?: v) t1 j# \0 \b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数1 z' H/ \. o, L7 z E8 }0 J1 Q; |
据类型,只使用
9 B% d6 w: h& }7 D0 \三维以下的数组;c、循环内只调用了内建函数(build-in function)。
3 A& l& n& Z- Z# i4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将( |; F: o0 x1 }" K2 E- T3 ^5 ~/ h
加速运行。: x4 v& T$ F3 h3 w' O; |" K( Y9 g
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:# p. b8 h: Q0 o: Y: Z0 F
x = a.name; for k=1:10000, sin(A(k)), end;
. h: a4 ~0 S' p9 h6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速: x3 B+ E1 w' c/ [2 S3 D! R0 N( o
度。
% f# i& I7 m2 h' N* Y7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低7 k5 f, n6 o& I3 I/ h
运行速度。
9 }! d3 j1 p2 v/ R/ p7 R9 l/ Z0 J
, W- L( ~, E# S; @二、 遵守三条规则: F- h. Q; k& d) r8 g0 X
# {% X7 ~7 ^6 V* K
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic. D0 c+ B/ k: T
h means it is designed, @6 A5 O2 s2 ?- J$ ?5 ^3 m
, o7 M. N# C/ \! A6 g
for vector and matrix operations. You can often speed up your M-file c
* }" a. v, y% M- Zode by using4 T3 [; i# _" h9 T/ X
vectorizing algorithms that take advantage of this design. Vectorizati) p( A0 G0 U8 }/ L# t' _
on means converting" d; t/ k1 A; c6 Y! @4 G+ H
for and while loops to equivalent vector or matrix operations.”。改进
4 H Y: @) S- c4 {) s+ _. ]% \7 l这样的状况有两种方法:$ ~; I3 z3 B4 j( t: B. t
$ p/ n% q3 C4 [. Ya、尽量用向量化的运算来代替循环操作。如将下面的程序:
; I9 N* e4 z4 p0 k! k
* G+ G' r p* Y( {- ?i=0;
/ t* Z5 {' L1 O* e7 l0 @for t = 0:.01:10
5 K0 ]- p+ Q1 b- @2 {0 Xi = i+1;
& W1 t2 U- K; R6 }7 C0 fy(i) = sin(t);/ w" W5 X/ M4 B/ E8 R" Z
end$ O1 k7 }8 X# @, u# w2 V2 I
替换为:8 Y0 S1 h. w. s" o M2 h
t = 0:.01:10;. }$ C' w; o3 m, H) j
y = sin(t);
" y9 [# d9 S& `6 q! x速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i/ ]9 X) q2 ~# {
permute、permute、
1 M1 ]8 w5 N: j, a! Breshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums/ ?+ \/ {! A' a% P y9 H( G
um、ind2sub、3 A! M/ X- d# n& `4 j( L6 m0 B$ O
ndgrid、repmat、sort、sum 等。. R) H" \' t3 ]
: } o2 J# t" i8 d; z请注意matlan文档中还有这样一句补充:“Before taking the time to
; u+ j( B% k' E8 S6 \! P+ c6 u6 }- m3 o# T3 Z
vectorize your code, read the section on Performance Acceleration.
: f" c* D! ], }# R9 t8 RYou may be able to3 A. y' ^6 V6 b$ |$ _6 V
speed up your program by just as much using the MATLAB JIT Accelera; }$ S6 _% j# O8 }
tor instead of
. x" f \4 G4 f" rvectorizing.”。何去何从,自己把握。
9 Z# P1 H' m h6 v+ R0 E3 y- [" Y( @3 i
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执& I5 S* C: h5 o0 U' [% q: m& X7 g
行循环次数少的,
# |: B4 k0 Y7 d( `. F内环执行循环次数多的。这样可以显著提高速度。: v T x; _7 f0 O! F# R
8 Q0 K3 m" V4 e% M# z
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on* Z6 B2 p' U" l) u2 ?4 C, A) b
es、cell、struct、
! t2 L0 ?- r' O, v* H3 Vrepmat等。
* M4 } n M# F5 S cb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:9 y' F3 I# m; ?! w: X4 ], @* B
; @4 ^$ ~) e) Q3 b$ GA = int8(zeros(100));
7 b& ~% D5 E2 e换成:9 {9 I+ f2 E7 M
A = repmat(int8(0), 100, 100);
+ c' Z/ `7 Z1 L/ kc、当需要扩充一个变量的大小、维数时使用repmat函数。
: ?7 d1 u! f+ G2 r) K: w5 o. P4 r
- C( H* x" w3 k3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。5 Z8 @7 K4 ]7 b, O* ^5 A+ Q
b、使用Functions而不是Scripts 。& F7 U$ A& ]0 T c6 @% R0 R: R
/ q" m; j* c" E; G2 \3 Y, l
三、 绝招
# C( I4 S0 _8 O) o$ E% y
2 Y3 \) N( r& T# L你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
2 c( ^% u# D" B% A. r0 @: n7 U1、改用更有效的算法% z: O2 E) A! A' [" a( i* W- y
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
0 G9 A+ C6 |7 H+ `$ x
g' g0 F5 M- L0 P& c关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
$ U; M: ~; x+ z% S. t+ S: m+ y( S语言文件,VC编译”。 |