本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑 7 `& t$ Q7 q+ {' v
+ E+ E" e- K( ~加速matlab运行的三重境界 加速matlab运行的三重境界4 c' z* E/ E0 z A/ H4 \9 o
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%/ N9 T: _1 C1 c, r$ p G% H' r+ N. P! ]
%%%%%%%%%%%%%%%%%%%%%%%
|. b1 A6 z; Z4 A) D1 h, r一、 遵守Performance Acceleration的规则; N p" Y* {9 R! z! B, @
二、 遵守三条规则' |; A' u, m. b8 k8 F
三、 绝招
2 d: ? [: x* }$ k%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
0 d3 K( t2 |5 l0 Y%%%%%%%%%%%%%%%%%%%%%%% 一、 遵守Performance Acceleration的规则 v$ g. e# o$ B# f& l9 w
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
% J. [6 \ A; Z* `$ ?$ ~其规则总结如下7条:
: a6 @3 Z2 ~5 L. G. {7 S0 H1、只有使用以下数据类型,matlab才会对其加速:
8 v+ _( N/ g8 N* N( c3 |) M6 K8 Ilogical,char,int8,uint8,int16,uint16,int32,uint32,double$ V8 Q- ?. j9 }$ ~$ w
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
" G6 R% H9 [0 b# a/ @) kre,single,; F7 |5 y# R# ~! j6 [
function handle,java classes,user classes,int64,uint64
6 t; m$ o# v; |. n' h; U2、matlab不会对超过三维的数组进行加速。
R+ R& k# U1 l( W; _5 n# w6 D3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值( u$ q; k" }/ C G0 U) W
来表示;& f& A w4 \" u) Z# x
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
. x3 t7 M: e9 I据类型,只使用4 b4 {8 c# n! {; ]4 E4 V3 y
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
$ |/ J2 O4 ^% j: ^! g- I; k4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
, s8 q& U0 S* c+ j" V" l* ^) Q加速运行。( G q+ Z% r" J5 t
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
2 \4 i$ Z i5 X' c; \) G0 ~x = a.name; for k=1:10000, sin(A(k)), end; E p, s3 T3 q/ L
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
' ]6 o' y; [3 x* t! `9 z度。
; [; H+ ?( @* ^$ {# r7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低: b* o- r1 b( G j' |
运行速度。
, V4 {: U+ ]5 n, T: v3 J' F%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
8 v0 K* _7 I2 @7 ?6 j* b% f, B% y8 d%%%%%%%%%%%%%%%%%%%%%%%; j) ?8 X7 u* P5 J0 q
二、 遵守三条规则/ g* A1 r! O8 ~1 n
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
2 v6 ^/ ]) n: Ph means it is designed- `# @6 \. j- S% l8 [* v. V
for vector and matrix operations. You can often speed up your M-file c8 J& v! I! N: V* X0 r0 v- ]
ode by using. s! F" ]5 h' o- w5 j6 a
vectorizing algorithms that take advantage of this design. Vectorizati: t, w) R4 n8 C a! C
on means converting5 `. S' L# Y$ t* r
for and while loops to equivalent vector or matrix operations.”。改进+ V1 z: a4 w2 k/ B
这样的状况有两种方法:
9 f; L9 N/ M$ J" M1 ga、尽量用向量化的运算来代替循环操作。如将下面的程序:
7 o0 g9 c( P' |2 Ki=0;
' d) x6 _7 I1 G& {: Tfor t = 0:.01:10$ d( R& s$ ^1 K6 B' z
i = i+1;
+ u- O& X0 ` \5 }6 `! My(i) = sin(t);( z0 J' `6 }* Q# ]/ B( |# r2 N
end
4 N. G/ ]! b6 ~$ s替换为:
, B5 X$ z6 T: c9 R. Y3 Dt = 0:.01:10;; w- I8 B/ |& p1 G6 K- h
y = sin(t);
! I+ {8 I" D j- y' P; @ A) m速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i$ O; ?4 O0 ^8 e2 P/ q, P
permute、permute、
" u! Q6 @& ~* C; treshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums4 s' j5 u# I) F# V2 K0 j3 d. o7 {
um、ind2sub、5 K8 O; {* I3 s' T, x$ z" E
ndgrid、repmat、sort、sum 等。
7 I6 k3 D4 o2 K# k2 m请注意matlan文档中还有这样一句补充:“Before taking the time to$ V" V# w0 \) ^" Y- T
vectorize your code, read the section on Performance Acceleration.
' z, U7 i e% bYou may be able to
( S$ d+ }* x4 \, ]: tspeed up your program by just as much using the MATLAB JIT Accelera; ]) s& Q& T6 T) i4 a2 b
tor instead of
5 t: f" F3 J: y6 c& W& u- ]2 svectorizing.”。何去何从,自己把握。
z, a# W9 L* W& Jb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
2 @$ _" U7 M6 L8 z行循环次数少的,
8 C9 N: W- P7 C( J8 m2 M$ W内环执行循环次数多的。这样可以显著提高速度。 p6 r3 l0 l" H% G# S
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
G- i/ z1 y d% O0 q9 G# P# T d% Aes、cell、struct、7 I. M* }& a% U7 R* G0 b
repmat等。
0 V8 p+ i+ w- x- Rb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
* {7 M9 C1 I7 r! k% |A = int8(zeros(100));7 A$ m: i8 `8 D6 X2 F: u
换成:
0 `3 K$ R( X. [% aA = repmat(int8(0), 100, 100);
0 Z4 D5 `9 t( X# a' dc、当需要扩充一个变量的大小、维数时使用repmat函数。
9 t0 Z1 u# z1 L8 r# {1 Y3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。( _, g$ [# ~+ z6 {* N0 G1 E% H
b、使用Functions而不是Scripts 。
1 Q( i: \/ L: m2 F%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
5 L' ^* |# ]" L# Y4 ^1 ^%%%%%%%%%%%%%%%%%%%%%%%6 Z- q* T7 E, D" J" I* S f
三、 绝招
N) {8 Q4 f- P ]! f你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。& K r3 @/ e' e$ H& g0 f
1、改用更有效的算法3 t2 `. O# z: m- Z; I
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 9 q1 a) m& f0 u! ]) A% O
6 [0 n" z0 |# L& j; L. ?& q: M
来源:iLoveMatlab) X! W; ]2 w' k& H3 Y
5 J$ l. b# z( @' e- d2 j ]' _" }5 `, f" D& i# j; a" T
在这里本人推荐使用‘绝招’。 |