|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
5 ]! a5 _" M* D; U4 X; q标 题: 加速matlab运行的三重境界/ r2 N6 @" d! j" a( ^7 c7 N
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004): X. W- B6 p7 l- Q7 ]6 Y
( u% P$ o3 b1 z加速matlab运行的三重境界 - w M& \" l1 g$ K' D
4 h# m, {$ H. C* b8 X2 c
一、 遵守Performance Acceleration的规则
+ I* d5 ` r8 Z: A1 j- z. W m9 g( }
) \) F0 d5 p- ^% \; Z" m关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将$ l0 K4 h. _0 J9 R- q
其规则总结如下7条:
; i0 _& {3 C9 V' w1、只有使用以下数据类型,matlab才会对其加速:
, F+ c! r2 f& P2 j Ilogical,char,int8,uint8,int16,uint16,int32,uint32,double% L( F0 H0 W* O& \4 l
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu# H/ ^$ ]- ^0 n: M' _
re,single,
2 s/ T! J, o$ V4 c: T
X: H( R7 R+ ~function handle,java classes,user classes,int64,uint64: b$ i, h: V+ T" B
2、matlab不会对超过三维的数组进行加速。/ F, k5 o, _" O$ w
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
# \8 F* J: G, Z' y. i+ i" ?来表示;
; @. I6 L" s7 X, S& K, r! ]$ z8 M' K5 Lb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数8 d4 A' ^0 \# b A& ~
据类型,只使用
) |* O( N1 ?$ m$ p% G三维以下的数组;c、循环内只调用了内建函数(build-in function)。+ M% H0 q/ V0 l
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
. u; g$ L, Z6 p+ _加速运行。: t: G; f9 l ?( g
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:7 F8 U% S7 d. Z7 w
x = a.name; for k=1:10000, sin(A(k)), end;
+ W8 `% b! x& b) G& g6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速: j2 z6 w% t8 ?7 ?. f! d9 C
度。
2 y* t C) j+ | D% L, a7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低* \7 i* z y& J9 J7 ~) y3 u
运行速度。- W& `) o5 n0 m9 x1 |
8 {! _: A. H6 H2 x4 Y3 V
二、 遵守三条规则6 t: J2 E4 E+ c! M# q
- h) f7 z- t* {2 b1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic0 ^, t% t* c2 E2 P2 G5 ?! @% O% ~
h means it is designed
; G) x& j3 k2 d+ U5 T
. j8 s3 e7 Z6 x( U3 g6 O2 ]4 zfor vector and matrix operations. You can often speed up your M-file c
" L- m) C" c [ode by using8 ]/ N& W) u, c( Z5 {. }4 d+ J/ |6 M
vectorizing algorithms that take advantage of this design. Vectorizati; s0 ~) X# p' ]6 `
on means converting! C( _# |2 y& ^
for and while loops to equivalent vector or matrix operations.”。改进
, j$ M+ E8 Y3 N8 L4 s这样的状况有两种方法:
# ]0 j; T* l& I/ D7 T
5 S9 H# @1 q# G' f# x6 F) za、尽量用向量化的运算来代替循环操作。如将下面的程序:
* R, Y: D O6 C- k6 S$ y; H# k# y6 Q% Z, W( K/ Y
i=0;
' V) K. u7 y! b% H Efor t = 0:.01:10
+ n7 [# `1 g5 ]) ]* u! _0 qi = i+1;
+ j5 _" p9 m& O5 by(i) = sin(t);$ m; {7 W5 B+ H8 t
end0 }1 ~( J; ]7 K' f0 Y- l
替换为:) l4 {: w ~4 A0 S- a) B* C
t = 0:.01:10; S Z$ Z2 O* I0 r( n: q
y = sin(t);
; V- F7 a3 y, G' P+ ]速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
% L. y/ J' z }/ x1 Q" xpermute、permute、 ~/ L# @- o S v( Q7 x0 j
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums' a3 T& s( X3 `) B* O
um、ind2sub、6 E6 _) |& M' A. [8 M* ^
ndgrid、repmat、sort、sum 等。
* d' K p+ _5 G0 E! x# y" M! M$ n: z- Q. K# z- a8 K0 ?
请注意matlan文档中还有这样一句补充:“Before taking the time to8 A! `+ f4 t3 a# l+ `
9 {$ x0 Z) E6 `* z- L7 x5 k
vectorize your code, read the section on Performance Acceleration.' w7 j5 K0 P) o, U
You may be able to, l& c# o& k& o6 H9 P1 a6 Y
speed up your program by just as much using the MATLAB JIT Accelera+ E: h5 w, A" r+ G. L6 s% G6 {
tor instead of" L. I+ U y# r4 l( M
vectorizing.”。何去何从,自己把握。
3 D6 {7 Z+ K Q# g0 @- ]8 a9 K4 B& K8 K2 ], ~
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执* k* s; F n" o- K$ c2 r
行循环次数少的,
1 `- L4 c0 o! U' D内环执行循环次数多的。这样可以显著提高速度。
6 d+ i/ l4 v) V7 P5 Z1 \1 ]1 {# U; F9 S, T: J3 J$ ]
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
% t, J/ T$ t7 s+ ?5 a d% \+ \es、cell、struct、$ O; P7 H/ d6 j! R# I
repmat等。) A# q- S; f) L3 K/ {
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:& t4 q# d# k! i5 T A7 S, ]& c
; N2 _: m" L V8 ~! Z' X3 Y
A = int8(zeros(100));
3 A: Q& t3 C- v; Z. F换成:( P( L! i. {* r; z7 E+ [( |
A = repmat(int8(0), 100, 100);, m4 u6 |, x* I5 S+ V- E n% Z
c、当需要扩充一个变量的大小、维数时使用repmat函数。
; t% N6 `, d& j8 q9 v% O z$ S) }! }
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
7 c. e. H# ]3 f* }" I4 K8 eb、使用Functions而不是Scripts 。
# u% Y& t' Z2 Y- E9 K9 c
$ \/ Q- w3 a; U, ^# q# U三、 绝招5 f" {2 P( K- `0 g, ]
4 c. @( r0 l+ H3 D% ~* Q: p3 N+ b* ?你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。6 t; e$ q0 A- t2 ?) L
1、改用更有效的算法
7 R! [# |$ b, P! g2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
% a3 D1 I0 q4 O& `8 l
0 F6 `* x+ t: z( J关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
7 D2 @3 Y4 o! `1 z2 Q8 ~语言文件,VC编译”。 |