|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
6 a4 B0 p4 v* @& V! C* d标 题: 加速matlab运行的三重境界# G: I3 z2 \" u9 ]. `5 M8 d( Z
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)( L; ^/ I! S2 O% g' F$ i, o4 f- y; Q n
( t3 x+ ?) l3 s9 h1 e$ N$ \0 r; R
加速matlab运行的三重境界 1 \4 ~* Y: _: X: a( m1 l
9 y. M0 ?8 r0 _
一、 遵守Performance Acceleration的规则
1 t6 `! E. v) P' D4 w
( Y$ U; n- r% m! P5 x3 L关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将# Y c: X( [' a+ b6 i: T5 U# N
其规则总结如下7条:
9 T. X4 ?6 T m7 I2 o* H% V ?1、只有使用以下数据类型,matlab才会对其加速:
" t2 K; T' D( h" b+ U9 A0 M+ V" jlogical,char,int8,uint8,int16,uint16,int32,uint32,double5 G/ c& v0 V7 ]/ f0 t8 K0 G0 M
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
8 Q% p: H! ^* C! B# L0 D/ Mre,single,
" c: r7 Z/ T/ a k) c5 s( p2 Z# j8 `/ v, d9 |; }; G$ q, z
function handle,java classes,user classes,int64,uint64
: O" u& z |( |- P1 I* @# E2、matlab不会对超过三维的数组进行加速。; C0 S9 w) K# z
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
* ?' @- a- o; q) {来表示;9 ~( `+ ?8 _( N! X
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数, e# p I8 u r9 Z# r
据类型,只使用) J% G, Q& L- p
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
7 n) k7 F- ^" B$ D3 u4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将2 |" ~+ P& Y( W6 I$ V2 T, C8 t& M0 W
加速运行。
1 x" K! N8 J- Q# J3 ]5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:- l4 F2 D/ C, ^, E$ [7 s; }5 {
x = a.name; for k=1:10000, sin(A(k)), end;
! c! t# \3 U, h5 f' N* w# ^7 T6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
0 o3 y$ Y8 v0 c度。+ x# F$ E" r: X7 t {
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低/ n+ I% J2 ?! n. j3 }0 B# f
运行速度。
& d, M5 Q, L% [% u- O& |6 F
% @, D) A8 Y6 W二、 遵守三条规则
0 f) ^/ T+ |3 D7 Z, ~
" b! n9 E; V" W3 [1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
& N1 G' I* c; |+ t2 m9 Zh means it is designed
C* v! T6 J1 p* `: M9 a9 b' K) s2 J% X. a
for vector and matrix operations. You can often speed up your M-file c
) U5 N9 U; [/ v& j. S" Uode by using7 g! p0 @8 A' r8 ~1 H2 P
vectorizing algorithms that take advantage of this design. Vectorizati
. W- ^0 F) d4 U* r6 Oon means converting
2 Q1 ]$ Y( e! Nfor and while loops to equivalent vector or matrix operations.”。改进
3 D+ T% o7 j. k4 F这样的状况有两种方法:
4 N& y5 R7 T6 g
8 F6 G8 H& E0 O: L7 @a、尽量用向量化的运算来代替循环操作。如将下面的程序:9 ?, k/ J$ |4 Z6 Y! M9 G
, H5 d L8 R% B u# y7 ni=0;
( I2 j1 I' T" c6 L2 Kfor t = 0:.01:102 j7 Z% A5 S$ w6 {2 \- J
i = i+1;
1 Y4 h4 u6 j$ y2 H; E; t5 ry(i) = sin(t);
" F. ~; P3 l9 O0 P8 h+ Jend' f# d3 K& }; t* [5 h0 K
替换为:8 G6 E0 `- r, l9 ]8 b
t = 0:.01:10;
9 p5 F1 R/ D' W9 K {3 O9 H: e5 ky = sin(t);
4 h0 W* r3 ]! y& ^- v1 I速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i* p" \) s# p0 [& ]1 o8 B
permute、permute、
$ L! \- L t2 }reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums8 b! {' F c" v2 g
um、ind2sub、4 X( n, W* P3 D
ndgrid、repmat、sort、sum 等。0 R6 L2 C, r2 E6 m! z+ a
! q0 t7 |7 X. ^& @+ V* o
请注意matlan文档中还有这样一句补充:“Before taking the time to
! {( b' U+ j) Y$ W2 t. Q
8 ]- Y" j" i& y, G0 E. u. Q5 `vectorize your code, read the section on Performance Acceleration.
% U. F4 w6 g' d0 Z7 C2 M) wYou may be able to
0 o x" Q" g/ i* l: ]speed up your program by just as much using the MATLAB JIT Accelera
4 s+ k1 s# d( Itor instead of
; t/ E. m, G8 a$ c( @* ^2 h' {( e' |6 avectorizing.”。何去何从,自己把握。
3 Q% s2 }! v8 f: x5 o# X2 W. h( O7 C* ^" p
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
9 C0 B6 g Z. W9 j8 L: S K5 u行循环次数少的,
; ?% ?8 ~, K3 K内环执行循环次数多的。这样可以显著提高速度。) Y% }( b2 F7 l) F. s1 I& D# |
# u( f# w9 {/ T' Y* W% N, B, C+ L2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on2 Y' J4 K) [# R% z1 \; M
es、cell、struct、
4 {# d* I: h6 Q' Y0 ^8 Trepmat等。
/ O3 j; S- W: V' T& tb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
3 y$ C' Q6 N7 E9 @' ^% A% w, S+ Q4 f- }+ z" v8 b! |) u
A = int8(zeros(100));0 {: d$ z* }- ~6 m6 r1 B* J
换成:
9 F* u u0 |7 L1 h, sA = repmat(int8(0), 100, 100);7 g. B0 g4 F, M( O1 e4 Z O' [7 g
c、当需要扩充一个变量的大小、维数时使用repmat函数。# p. ^ _0 |6 N3 Y) v
% L7 \- t h" P- r& E
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
3 @0 b% z% x5 `& |b、使用Functions而不是Scripts 。
, u4 t. x: P, o( k. q* ]
$ F4 Q) E! n8 e7 Y* W三、 绝招
o* l% ?$ f2 [7 N7 ^7 o$ ]. c- o* @0 {4 J
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。6 v K3 x* o7 P8 h1 y j: W4 k$ z* {% M
1、改用更有效的算法, h! q$ I+ v% d+ C$ Y9 W3 l
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。) s4 p" F; K! y
1 c/ F0 P- |! j1 M; h
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++5 f: u) F% g" J* @# v% D3 r- G3 i
语言文件,VC编译”。 |