本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑
; R+ u/ K+ p, q+ s+ I
+ J" S# R5 X& d8 P3 V% r. B6 c' o4 F加速matlab运行的三重境界 加速matlab运行的三重境界4 `4 s. ]" O2 \3 c
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%! q* d# c; I; j4 u$ e) }, n9 s' n
%%%%%%%%%%%%%%%%%%%%%%%" q# }$ N9 _; V. {9 b
一、 遵守Performance Acceleration的规则5 t$ Z8 V: O/ c; b( p# N
二、 遵守三条规则2 v: t# n5 Y4 @$ m# k
三、 绝招
! a5 q' G- W- Q%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
3 z+ U7 m$ `: C" l7 X%%%%%%%%%%%%%%%%%%%%%%% 一、 遵守Performance Acceleration的规则
9 V+ q5 O. A0 `& u' R5 T) l关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
' _( w5 A% e' w' ~其规则总结如下7条:+ K* k5 V* J: W2 _+ V0 c( V f
1、只有使用以下数据类型,matlab才会对其加速:7 G* n, {" I* n+ W- R
logical,char,int8,uint8,int16,uint16,int32,uint32,double
. N, v( G2 z3 p4 h; h% P而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
3 r1 K; n' \* p4 N$ u# K# Y+ n( Xre,single,. I- M, ?8 j9 m5 x
function handle,java classes,user classes,int64,uint64
2 p3 r2 Y, }. d/ Q: H3 n6 E' l$ n9 I2、matlab不会对超过三维的数组进行加速。% j3 |. ]* {3 V2 J a/ x
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
7 q, r- U6 B9 J! U6 M& r来表示;
2 Q3 F3 ?$ r; J+ o( ~& Jb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数2 ^6 ?7 H0 g6 {# p6 C
据类型,只使用' g; Q3 s. I: L: W
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
% J, {; u" {( f' ]* l4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将+ H3 ]7 J N+ B$ Y& ^6 ^7 e
加速运行。6 |$ L4 Y5 u6 B% x3 n: z8 T3 J, l
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
( q) _4 c7 H, i/ bx = a.name; for k=1:10000, sin(A(k)), end;3 l% q% M# z& g: D* m
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
$ Q6 C7 V ]& u, A% m/ E/ M( b度。
* U E; M6 d, N) c* g# z3 j7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低: i9 b0 M* F7 U. v& I
运行速度。
: c8 |# E! `) d%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%1 t6 A) b+ W: d. o% j( v7 Z
%%%%%%%%%%%%%%%%%%%%%%%5 C! t$ o8 d& N! j7 G
二、 遵守三条规则
* y, M+ D a' }1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
6 a& ?1 B2 U8 N# A' Yh means it is designed
8 \, W; X8 v z: Lfor vector and matrix operations. You can often speed up your M-file c
& c% c5 q3 [' jode by using" n. C. p; g: V" Q
vectorizing algorithms that take advantage of this design. Vectorizati( S+ O) k7 T) j' \ P# z
on means converting+ x- `. }2 w5 h) r& N
for and while loops to equivalent vector or matrix operations.”。改进
( Y+ x; V# i2 m* T2 U这样的状况有两种方法:. |9 e7 [# p) T8 k- P1 j
a、尽量用向量化的运算来代替循环操作。如将下面的程序:
7 C& g* ]; C' ~8 i3 t6 yi=0;4 L* y8 `$ x/ c1 v8 p& `
for t = 0:.01:100 x, P2 `& q% Z- O
i = i+1;
# h& Y+ T( R& Q8 T1 w, ny(i) = sin(t);$ s: u2 X! u D5 G3 x1 y
end
% i8 M7 M- C [$ }. l7 C5 w. R替换为:$ E$ e! J6 v: o8 X( {% w
t = 0:.01:10;9 o. I/ t/ F+ i) g* [
y = sin(t);
/ |# K: j! j! y速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i$ U5 N6 v! C6 ?$ R& Y/ \
permute、permute、; g! c, O6 a" f) m# [
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums4 \4 {2 Z- {4 `1 S7 L; t
um、ind2sub、$ o( w. D% V" E& h9 m( s, x- K
ndgrid、repmat、sort、sum 等。1 X# N- v. F0 r% n) h- w8 p+ d# g
请注意matlan文档中还有这样一句补充:“Before taking the time to7 K0 i- w% J0 D5 Z7 I" _' K% i% s
vectorize your code, read the section on Performance Acceleration.
; n- E t' T6 J& i0 lYou may be able to. y9 U$ D/ {- E
speed up your program by just as much using the MATLAB JIT Accelera
3 v0 |- D1 i2 O3 ztor instead of
5 b& \, O S: W5 q9 |/ P! tvectorizing.”。何去何从,自己把握。% Z8 ]! d& q" F$ u6 \6 z
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执" M* u) I# Y! O' m3 c) D
行循环次数少的,
4 F3 X' E! a0 D% L! S内环执行循环次数多的。这样可以显著提高速度。
8 }9 w1 I4 [( |9 O+ v2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
/ _8 h" l* l) @1 n1 B+ res、cell、struct、; k) h. P/ Y3 [; t" o
repmat等。8 V. j, P8 t. B& {8 C6 ?
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
# @3 B" S5 R) c% K: VA = int8(zeros(100));: Q- A9 ^) U O/ C6 q/ Y
换成:
) R; \7 O" G0 O+ a+ A' ^A = repmat(int8(0), 100, 100);" C4 Z0 ~9 D. w3 T
c、当需要扩充一个变量的大小、维数时使用repmat函数。7 _9 {9 Z& [2 F! v, f& R
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
, t+ o9 x( N9 J; I/ r4 ?, I0 Jb、使用Functions而不是Scripts 。7 r5 C& g4 s9 `6 c# Z# G. I% o
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%7 w, t- `+ T8 t) T4 V' ~
%%%%%%%%%%%%%%%%%%%%%%%
C% F& e. x4 o& E三、 绝招; L/ Y2 B' P5 ^7 \: g
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
% f* ?' _9 E3 T. d1、改用更有效的算法0 E" E- ~; w& m
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
. Q9 K* e! T; u4 p
: H f8 ^% J( y( ? 来源:iLoveMatlab; X& ]) k( R" [( Y2 U2 O) ]. a% C
5 A0 H, X, }+ J- w2 d1 r# s
+ x. L( h6 T/ A* n+ R, O6 H
在这里本人推荐使用‘绝招’。 |