|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab" U3 z- I, Y' Z0 n k
标 题: 加速matlab运行的三重境界
. a, M" b8 B! J* e& Y8 c/ V( B发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)0 v H' ^% Q6 _, J, p
5 L1 v9 G9 Y4 @( p- R$ `5 k加速matlab运行的三重境界 5 g& D; t" O1 E$ c( u
5 @# t1 r. S( Y2 h4 b0 x) R2 w! ~
一、 遵守Performance Acceleration的规则
4 F1 V9 G/ i' q/ M( s
" f" c7 L, ]/ d4 `关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将4 K0 Q8 {- j$ P5 H7 \& B, r: z
其规则总结如下7条:' c$ x* I5 F7 p* ]
1、只有使用以下数据类型,matlab才会对其加速:
- @6 M9 Y2 I3 x/ ulogical,char,int8,uint8,int16,uint16,int32,uint32,double4 @; e! [) D+ h) b. X8 B2 K9 P
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
o/ F l1 a, x* N" Ere,single,* n. \5 i9 O$ [% a) k: O
) Q! X& J- I2 d( L0 G+ r
function handle,java classes,user classes,int64,uint643 o/ Y: i) X9 T5 N7 V3 X8 [" f* X5 s
2、matlab不会对超过三维的数组进行加速。
4 Z% M* K7 V8 P! Z1 a3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
# J% N ?5 e; @5 @$ v1 q来表示;
* @1 g% h9 ]7 ^7 n g7 u- _, Eb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
! t* l5 G/ T( L4 m据类型,只使用- X. a/ f) z. O' }- }: d: h- @& R
三维以下的数组;c、循环内只调用了内建函数(build-in function)。, S0 R7 Q. u6 Z4 V
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
# [* k7 q' G% T! m8 r加速运行。1 D2 m7 o/ C9 P* T8 z* l$ T3 W7 [) Q
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:; X; S/ s( x% f, P* S& N) Z
x = a.name; for k=1:10000, sin(A(k)), end;
+ ^" N# t2 G& q6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
, Z O' U8 a) A/ |5 s5 [$ N! a度。7 S- K, ~1 V) `8 R
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
; |3 Q% o6 }4 i' |' n9 |3 J7 N, ?运行速度。" Q/ [ @% U. ?. ~0 ~8 E
5 a8 q: R/ m$ o+ j! } Q
二、 遵守三条规则' P3 L. ? v; ^/ p( d% U' d
& g0 H# `$ h6 Z; |2 @( m9 i+ R) ?
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
2 \; l, E G4 ch means it is designed
, A; b G# l# C5 F% z' q8 x; U+ k% }
for vector and matrix operations. You can often speed up your M-file c7 \* m ~: Z1 H. n2 ?
ode by using5 G1 |9 {' H5 t |
vectorizing algorithms that take advantage of this design. Vectorizati
% A" z% }1 E% e: j7 v2 g. Non means converting; W3 q) m2 Y3 | |+ z* @$ [0 U
for and while loops to equivalent vector or matrix operations.”。改进
3 Y, [- a& {2 G0 L! h& h这样的状况有两种方法:+ A- H8 i' }3 n, b/ N9 J# v. R
, {9 B M8 h; V8 [
a、尽量用向量化的运算来代替循环操作。如将下面的程序:
. L2 b! _" E& |* ~2 L3 ]4 u
+ r1 ~2 a, ~) w7 H3 d, b; ui=0;* f: @# r' l5 O+ L" q' f
for t = 0:.01:107 k; q2 f/ I( W: Z! o
i = i+1;
1 `4 w& C+ h+ }y(i) = sin(t);
( }3 h" g. T$ h1 M3 g3 x5 k: I3 R Iend
4 b3 f2 ]5 Y. q# }: h; a替换为:
; f n3 b% _4 D2 S) }) mt = 0:.01:10;
7 {: i/ q. N/ @% T3 }1 Ny = sin(t);( k9 z7 q' X+ C' x6 J, N1 [
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
" U; Q- X* _" J3 [* r1 M$ Y1 }permute、permute、
5 P! h: M4 z' \& E8 g; S3 @reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums, {2 Y' Z4 F$ W2 O6 ~
um、ind2sub、
! v8 Z' U5 _7 Z# H# q$ E8 n5 |2 Andgrid、repmat、sort、sum 等。
4 Q- G( c8 N4 r5 v9 U2 `8 w e7 e
7 b. W$ N0 f4 I, _7 j9 f, E2 J+ o请注意matlan文档中还有这样一句补充:“Before taking the time to9 _7 U& j* [& q5 O
/ |6 l# S( f, |- j
vectorize your code, read the section on Performance Acceleration.
* l/ R3 [9 H0 ]/ Q+ J% x0 zYou may be able to. i) g- s. G3 q) }' |9 K8 B5 I; l
speed up your program by just as much using the MATLAB JIT Accelera% X3 y* c4 `* y$ i4 p
tor instead of9 ?6 f0 G0 t% }0 L" q* k, x K. B
vectorizing.”。何去何从,自己把握。- P) U: M6 l& k5 t7 R+ M# O( v/ d
6 F: Y# @6 X$ j7 H8 |0 sb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执$ k9 e( |7 V* q% H( X* t( `
行循环次数少的,
9 `+ i7 D5 H s' ~3 z内环执行循环次数多的。这样可以显著提高速度。
" [7 s' B7 Y8 ]1 \9 Y0 r0 `
2 N) j& v0 n9 F3 J6 T2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on0 O; |! ]( e8 K6 G
es、cell、struct、
; f8 V o6 |# D; F: G5 Drepmat等。
( h9 S3 Q) ^, T: P- _$ k& @b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:7 i% C6 n8 P: ?. d4 T) w
! y* Z# {+ x6 WA = int8(zeros(100));( \( [' J* K6 P. a3 ~
换成:: g7 m3 ~0 L1 f& Z
A = repmat(int8(0), 100, 100);# I- I( [/ P O- o! F( [
c、当需要扩充一个变量的大小、维数时使用repmat函数。
+ n, O& q7 f: R, b+ X
. r$ H1 A1 c, n9 U9 U/ g3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。9 y H( y* @3 n
b、使用Functions而不是Scripts 。: Q7 |# `1 w( s) B/ ?5 R& {9 B
1 _+ O" Z9 O" p( I三、 绝招$ {$ e# m! ~3 }+ k/ b4 m5 w- ~
g Y8 ?3 c* e9 G+ p7 E你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。& O4 t6 r) c0 S
1、改用更有效的算法+ ]% ~; x' S8 ] M, [# i+ u
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。* Q0 {" V8 a) m( e
+ @: b0 {& a0 t3 Y3 w- I# k关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ L* `2 f( l- |- z, m1 D
语言文件,VC编译”。 |