|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab/ [& q+ B& G4 Z/ @. W/ l* t
标 题: 加速matlab运行的三重境界2 l3 i$ |* w8 ~1 e; Z9 [
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
$ a+ W5 L* c9 O5 D# F7 z
6 b# l; R2 Y, `/ C加速matlab运行的三重境界
* ]3 R2 }# J7 K" {& u
5 N4 i% Q) |) s一、 遵守Performance Acceleration的规则
2 E# _- s$ f& k! q7 |( e& m. I4 ]6 M( p
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
! B* A4 p9 U' L9 E& T4 x, `其规则总结如下7条:
! ]! m( L4 P$ m8 T) r6 |1、只有使用以下数据类型,matlab才会对其加速:9 s) ^. R" K4 }5 Q: J* U4 ~+ E
logical,char,int8,uint8,int16,uint16,int32,uint32,double
, [- l, p9 |& U而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu+ B& J6 ^. u! @; u; e' Z; P
re,single,# e& {$ T" Q: m' }- x( l* Z& L
6 \6 S1 D; I; ?function handle,java classes,user classes,int64,uint64
1 T5 ~$ F4 j: G2 y2、matlab不会对超过三维的数组进行加速。' X4 E( U# |0 a$ ~
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
3 t2 [0 G5 o# M( I% K来表示;
- p. E1 x j5 L4 o w+ f! N: ib、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
) f8 W. n( O) D7 j* J5 j$ i据类型,只使用# l+ _8 d! P/ K7 R
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
! _. M4 D- X. G/ c! i( J- J2 ^4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将! ~% I* ]0 N' N; c: R4 k0 }
加速运行。. b3 L! f' S8 |
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:: T* Z" a8 L5 \$ M/ H- ^+ V. O; b
x = a.name; for k=1:10000, sin(A(k)), end;
$ m: b/ v! y2 H( l8 g, x" U# {6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速6 p+ ]" d4 d# V( N! g
度。
- Z; U1 a$ Z" N) E3 c& ]7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
) O3 i% U+ k4 W, e7 U% e6 H运行速度。
5 J0 n& v6 L3 |2 f4 A; b3 e3 U
$ W/ H+ H, y# Q; p/ o二、 遵守三条规则8 \6 s* j0 v; A' X2 t
6 X6 N) i( C. N# ] S- q+ ?( G1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic' a5 A- f% o' p3 c* y* a- x; k
h means it is designed
. T' h/ x# t2 @. z( U4 f+ B0 I6 ?5 x, Y
for vector and matrix operations. You can often speed up your M-file c9 e- q# t6 S# \9 ?! g
ode by using
6 F4 Y/ O0 e7 C V: |vectorizing algorithms that take advantage of this design. Vectorizati
/ R; n/ |6 w% h# m" e' A9 T/ I* uon means converting
& Z& }, Z% @& X0 D$ L+ `/ g3 B9 sfor and while loops to equivalent vector or matrix operations.”。改进
" H: u- N' S/ b3 K7 T这样的状况有两种方法:
- i J: A* o+ l' i$ F( p/ `1 j& S' g, W" ^2 G; S# B+ P8 u* k: ]
a、尽量用向量化的运算来代替循环操作。如将下面的程序:: s* ~4 A, C1 H5 w/ U1 o
3 @8 g+ P2 k! ^3 M- mi=0;# X9 x5 k0 q' Z0 q& k. \$ f/ i
for t = 0:.01:10" f8 Q2 z" |9 `1 z; `. z
i = i+1;
) p3 A) l. G ?1 F: By(i) = sin(t);- R4 _- M Y! W
end* B R6 `! j4 o6 S) v$ J( m
替换为:
+ Z4 y9 @8 [; Z( T4 P% v6 I$ jt = 0:.01:10;
' _% r T, |8 b' |7 k/ u, u' ~3 By = sin(t);
" W$ c: ]7 R4 j速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i% c# i, V5 e9 N. T4 P9 ^# p
permute、permute、- g" y1 @7 z5 B. t/ {
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
8 h' W8 Z6 |" P8 B* vum、ind2sub、
, r5 Q6 N* Z G9 X) I$ A: Gndgrid、repmat、sort、sum 等。
' ~4 V o w9 G
* s; x. z' H/ S0 c请注意matlan文档中还有这样一句补充:“Before taking the time to' q% p4 D) f' e# G* e6 t
1 R. l0 P5 O$ ~2 x" A9 J9 dvectorize your code, read the section on Performance Acceleration.
3 v# v2 q6 [ n: HYou may be able to
' n1 u7 {/ Z2 {+ tspeed up your program by just as much using the MATLAB JIT Accelera
+ b6 R$ x) I% g7 I; o2 G# Stor instead of
$ J! i- i1 K1 Z; k7 p# gvectorizing.”。何去何从,自己把握。
6 D6 D9 r$ H& w6 x$ K y$ g+ T: w; w k( i2 [1 W7 b* k9 L
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
7 [# D+ e- G2 r2 Q8 `1 f行循环次数少的,5 Q1 X* Q, o/ C" m
内环执行循环次数多的。这样可以显著提高速度。
2 R- X- T3 ?, h" |+ x3 l
, c8 d: `' V+ D1 u1 ?* [- c# W2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on5 `, A) ~; ?- _/ N
es、cell、struct、
+ k+ R3 t& k$ e5 |9 a1 orepmat等。5 t. k: @% N! m* N3 |+ j/ {: ]
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
7 t# o" }( t, t3 M% K
, \$ [( x5 B6 N9 ?- W$ lA = int8(zeros(100));
i* ]0 |8 B( b6 ^5 O, L换成:
6 K6 _0 d3 N7 {A = repmat(int8(0), 100, 100);2 R- y% ^3 ^, m/ o% B) z, `
c、当需要扩充一个变量的大小、维数时使用repmat函数。
# E8 q/ u) \/ l9 u2 z1 x
& J* K: w6 ^$ X; e+ c1 v9 T3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
/ |3 A* M3 m" m9 K: N- ib、使用Functions而不是Scripts 。
( X$ g* F. \3 G& ]$ J2 e
4 N) _, [" @( p# z三、 绝招; s% A* I [) i9 g, n
* @5 t ?+ P/ e) N) k4 ~# S0 h你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
2 g9 U0 i; @$ @' J1、改用更有效的算法
1 ~; }* K3 F" L* y1 T9 L1 U* y: D6 Q0 _2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
' I. v+ z& W; T% W, f/ D- b) X3 C4 w* }' g. n
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
% Z! A, M. o$ M3 m语言文件,VC编译”。 |