|
非常实用的Matlab编程技巧。可以试一试。
; b$ e0 w7 b# l. z8 Z' h1 M$ NCTerm下载文章: 紫丁香★; E6 e1 G" b6 ?5 G
& n- r& s$ B2 D( V发信人: fork (撒哈拉沙漠的沙), 信区: Matlab1 X- c. [6 g* T1 a
标 题: 加速matlab运行的三重境界5 f* z3 W8 v" b/ f8 @3 O$ y7 B) w- m
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)8 E/ n( t i4 c2 I
& j7 b* U9 D- z* Z
加速matlab运行的三重境界! L6 Y9 Z: b: p! R( x
一、 遵守Performance Acceleration的规则
h3 P# {# u5 q& C) @9 `二、 遵守三条规则
; K# d/ T0 p/ x三、 绝招
+ ?+ A- ~, U' k2 D一、 遵守Performance Acceleration的规则7 a2 R2 W5 u( I: ?" T+ f
2 @ U) d2 `0 o& w" h. ?+ A" n关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将+ d8 s0 A' \6 ?7 w5 C
其规则总结如下7条:
, \: B& N7 e4 ^7 N5 O1、只有使用以下数据类型,matlab才会对其加速:
, S0 w- n" s, \. J0 Z/ [logical,char,int8,uint8,int16,uint16,int32,uint32,double9 b- [& N5 A( ^0 w8 v4 \
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu/ R7 }' E7 g* m$ U8 e
re,single,7 p8 d1 _' @ C: K6 W3 G
0 O$ c9 [# A% t% V7 i
function handle,java classes,user classes,int64,uint64
7 [0 E0 Y% |3 m* Q6 h! r Y2、matlab不会对超过三维的数组进行加速。5 L1 d9 Z4 x2 R! g) ^) U; G
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
7 t& z9 ]2 J6 x; n' o5 f6 X- Q来表示;5 H. D( ^* n4 o: I2 E7 u
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数7 P c$ T2 s' t5 z; h
据类型,只使用
9 i, n# @0 h0 u三维以下的数组;c、循环内只调用了内建函数(build-in function)。! q* p* S2 g# l; D V1 b
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将: f8 d0 |6 H8 _! l1 N6 v: v
加速运行。, S/ m& H& g2 D; j% L8 Q$ _
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:6 p& N# o* F1 S& b7 B7 K$ f9 X
x = a.name; for k=1:10000, sin(A(k)), end;
4 s1 R2 ]- B# ~! f. D* q6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速) |6 t3 y/ b0 H7 c1 h
度。
8 ?% v* Z/ X: ]9 x. w$ s7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低* t: A/ T* i$ P- C# l( C
运行速度。( t/ [4 O D3 L0 d7 o$ `& x
/ |9 A1 G& \" H' ~2 j; n5 S) c0 L* T: V
二、 遵守三条规则
! d7 O$ i" ^' i( |0 J; p, \; }4 ~* y) o6 X9 n
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic; s# l. R- P J+ ~6 T) @) u/ Y
h means it is designed
' T/ v7 i( Y9 C0 E+ r; d j4 B- S5 Y- d' ]- S
for vector and matrix operations. You can often speed up your M-file c
8 O9 g# V) w" A4 M6 e0 R$ ~ode by using- Z+ G. x7 Z0 n$ B8 _, V2 j
vectorizing algorithms that take advantage of this design. Vectorizati# g3 k* T e$ ^, w" z
on means converting1 H1 g$ S. ^. @9 {5 s" e& x1 |
for and while loops to equivalent vector or matrix operations.”。改进
' }( b! Y; `. X, T这样的状况有两种方法:- I1 j" e! t1 b! I. z: Y0 E
5 [ e1 V- X- O- `' T6 o2 p# g) n; n$ Sa、尽量用向量化的运算来代替循环操作。如将下面的程序:8 X5 U, b, F: z3 _! A& A
6 R7 q, Y3 N$ h; O6 Yi=0;
4 ]! [( w; k8 A0 |for t = 0:.01:101 v( N" [3 C8 J8 `
i = i+1;
, G) U. g: Q$ q) Cy(i) = sin(t);3 `6 Y* @' Q: _/ {5 o
end
' x5 g3 B. W9 B/ u替换为:, T4 g- D% h% W2 h' e- Z
t = 0:.01:10;
4 X, h3 W% L) wy = sin(t);5 i3 J! C" Z: p3 f# E8 c; D
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
4 z% H. x$ B a5 o- C3 h/ W xpermute、permute、
, T8 l3 l8 Q5 ^' Z" S% v8 H- ireshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
( I/ g. C! U6 K fum、ind2sub、) k8 T' v( s' i3 u+ n$ }
ndgrid、repmat、sort、sum 等。
7 G( R/ A3 E/ e
* ^7 n& v8 ?* _ g' T* M3 M请注意matlan文档中还有这样一句补充:“Before taking the time to
2 ~0 D9 J+ S$ A" r4 D- k* H' ~' ~ Q! M% T: w9 x0 `( ]- O
vectorize your code, read the section on Performance Acceleration.
' O- q5 s4 G' ~, ?; M$ S4 b$ p/ pYou may be able to- {; o+ e) k2 Y% U
speed up your program by just as much using the MATLAB JIT Accelera
% [% {. q9 M+ ~& w9 c Gtor instead of
" w$ j& ]7 M. D* V3 W! kvectorizing.”。何去何从,自己把握。# y9 |- B% z: M
; V& H1 Z I2 y3 t) K8 B- x, ?
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
# R" z* T: Y+ C: v6 i$ h行循环次数少的,
8 D! s/ ?. U& g4 Z3 @( k/ j内环执行循环次数多的。这样可以显著提高速度。
\4 ]. |: N' k7 s- S& {+ o5 P; r5 M8 l u. Z
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
4 y/ u2 a# x9 n4 Q+ hes、cell、struct、
0 o; m" B8 E8 i1 `" srepmat等。 t" ]% i3 n: V: Q5 d
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:4 ?( f- @0 l4 O% E" l
: A$ z- Z: z" A* Y& Y' s3 TA = int8(zeros(100));
4 t/ q6 E [# A换成:4 x1 }/ z& h8 b4 Y
A = repmat(int8(0), 100, 100);! a8 v+ {! o: o/ q+ T
c、当需要扩充一个变量的大小、维数时使用repmat函数。
" M* x, @7 L. d7 I; J% W/ a
6 z. W9 C6 y e3 ?4 {% v2 [) f4 w3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
. V3 t9 ~2 s, q+ C3 n: Ub、使用Functions而不是Scripts 。
' d1 m: c) S" |3 f7 o0 I% V- |$ U1 j
: W1 \6 S/ b5 h) \
三、 绝招4 h4 L% v$ [. w! }
- x# n: M9 v4 `0 x; L* V( s你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。" K; ~' n9 e! s7 _- W7 F
1、改用更有效的算法
7 @, u$ X; t& r2 b9 D7 T* b2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。5 q* F" v4 W% T0 p& L( S
1 h1 H3 ~, C. H g" J+ V关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
8 h5 e2 ~$ ~0 H, O语言文件,VC编译”。 ) N" {& P' b% O i5 l; {
|