|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab( D3 Z P' ~7 L! ?
标 题: 加速matlab运行的三重境界
5 {6 G2 `+ w- i @1 v. L发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)1 N: Z0 h0 d9 k
' H! Y1 z( U0 o0 O. H' }加速matlab运行的三重境界
% s4 {" Y8 ]- ?9 Q: Z4 b* \, E- B1 V" a7 m
一、 遵守Performance Acceleration的规则. C7 _6 Q' u- v+ t6 \: {
1 S2 v/ e m$ ]. M n3 ^& y1 r- q
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将9 C9 x. N7 J, X3 ~. \+ h
其规则总结如下7条:; ^# \7 T+ k4 M8 l5 |- M0 @
1、只有使用以下数据类型,matlab才会对其加速:- ^& ?* _/ Z: @) j/ ^6 g
logical,char,int8,uint8,int16,uint16,int32,uint32,double
( M" z- O6 y$ ?$ ~3 u% {* ?6 V( L而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu$ y3 B3 d# F; @; e; g0 T
re,single,
# S& T% c( K8 V6 b$ z( E9 t3 K" o
4 P. q" @/ u$ \3 h' ^% @function handle,java classes,user classes,int64,uint64
% d2 o0 M6 J8 F* Z2、matlab不会对超过三维的数组进行加速。
/ y3 _& }7 |4 j- @: \% h9 F) p3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
! u- U7 P9 Q2 a: y来表示;
7 V9 |4 M, O2 {8 d( W, l, Pb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
P. [: \6 P. K: y' d' x1 b据类型,只使用+ a2 @. a% h1 I
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
$ H6 O8 X! s6 P, s/ D4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将! C2 d, d- K9 s3 q& I- J) a
加速运行。) [0 G% G0 R j) ? ]7 C' e; x
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:, C0 B5 S) a2 o% O
x = a.name; for k=1:10000, sin(A(k)), end;
$ g( W' ?2 E8 f! W6 I% h2 n6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
( o+ W# x1 Y9 w4 Z) E1 ?! u5 H9 W4 ^度。" i4 g+ ]; u8 x* G* z
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
) {1 f A: s4 g- h( ^$ C' J' N3 c- d运行速度。+ K" y a+ o M, u' z
! j1 Y' ~. W$ h2 e) }9 E( M
二、 遵守三条规则
+ M; ]7 {4 L, @1 R8 u2 r- V
0 Q% Y5 v% j& C1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
7 ^3 p& M) e* U" M/ E" Vh means it is designed
& r2 s) X# P: f2 C: O5 {5 O; d4 F% m( i% H' {
for vector and matrix operations. You can often speed up your M-file c
. T# @6 [4 f+ d; A1 v. Bode by using
" P, {3 H, e, n& N. evectorizing algorithms that take advantage of this design. Vectorizati
" c2 v! O& t; @: \- O3 O2 Ron means converting
! c( r5 l; H6 \/ Wfor and while loops to equivalent vector or matrix operations.”。改进9 c1 U. }- o7 ?0 p- r
这样的状况有两种方法:
! B' y' c2 i% ~$ a% N, d! _/ h1 z8 W6 |3 z; D) ^
a、尽量用向量化的运算来代替循环操作。如将下面的程序:
# }% p" Q7 w& ?, j7 q
9 Z! r8 Q3 R5 J! u3 ji=0;
4 ]. f3 _0 `# pfor t = 0:.01:10
! B" C( i7 }# n; X" B0 ~4 |i = i+1;
0 m. ?: }& y; A" _/ }; h5 [y(i) = sin(t);
% I, Q; ^. E8 @6 y! h3 pend
2 e3 J, K/ U0 y替换为:
7 ], S$ Q( v5 mt = 0:.01:10;
& P( H' E) J' h% O& T; R; y2 `y = sin(t);! ~( v, R+ x) I V$ b0 A
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
% b' x: z! B' }) Mpermute、permute、
+ z& ^! \( D# j: V/ W3 g+ Yreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums+ e9 P! O* o b0 S; P P& s$ U
um、ind2sub、
" `+ o- t8 B" }& J8 xndgrid、repmat、sort、sum 等。; h- j1 H. O' j
6 y" b+ Z @ L* b, Z请注意matlan文档中还有这样一句补充:“Before taking the time to
4 k1 i- t" ~; J& h, w, l- b$ r
! J7 K" n5 t6 O: e+ Q5 pvectorize your code, read the section on Performance Acceleration.
9 C" M7 O& u% X @- QYou may be able to. C- {: O* z3 `, x' Z, s6 G
speed up your program by just as much using the MATLAB JIT Accelera& L- F' i7 `! @# ~0 N, Y* m
tor instead of
& k: V8 N8 V7 A+ R- E6 I$ R# V7 wvectorizing.”。何去何从,自己把握。! e0 X) W! I, I7 r2 `5 A$ D
& s, M8 W5 U( y' `; y" {
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执6 {' _& w' r1 @. Y
行循环次数少的,& c& g% k6 H2 G
内环执行循环次数多的。这样可以显著提高速度。2 l W) d. o- k
' Z/ {3 i* @9 g/ u+ \2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on$ b" o8 d) q% Q2 ~0 L4 x
es、cell、struct、
% }* x8 ]4 F3 X1 t/ ~, f3 }- }repmat等。% A# X4 s0 E8 R9 x# v* Q
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:0 [+ C1 g1 U) v7 k1 Q5 k
9 N' q/ J+ {0 g+ p' TA = int8(zeros(100));" e0 ?+ {0 @! L$ F
换成:( ?- h+ ]& D7 I1 h; y
A = repmat(int8(0), 100, 100);
1 B% p" K$ B7 L1 k) ^6 U5 C0 qc、当需要扩充一个变量的大小、维数时使用repmat函数。7 p0 f4 B- b }9 H) A
% R2 A7 _. P% w8 k. _
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
$ N' C0 I/ x2 ?3 Q, zb、使用Functions而不是Scripts 。! } I( n! V* \1 `3 s
+ m: k+ _9 u5 N' P' ]2 E+ M' ?; @三、 绝招
+ o/ P8 }: L7 g* L% R' Y6 o" W
. w( z- d' P( R3 _2 B: ~你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。) y; m( N$ U; y5 ]3 Y9 [$ }
1、改用更有效的算法, u4 Z6 i# c% E
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
4 |- W4 S5 ?/ R; L: n' }4 D! B5 l
; v7 n1 o0 R$ |" Q$ ~关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++5 C9 B/ r3 b' P- X9 v
语言文件,VC编译”。 |