|
非常实用的Matlab编程技巧。可以试一试。 % V) l4 \6 g" c0 I) N
CTerm下载文章: 紫丁香★6 I$ s; K0 _2 R" z9 m5 U0 c$ l
8 }. v6 h. y r5 Z2 m, O发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
9 b6 j. y$ l% e: [标 题: 加速matlab运行的三重境界6 K) _. \+ V% w& I+ Z1 i/ c
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)0 A y1 f4 y; O5 Z, x: g
3 ?2 f7 |% A8 u/ C- Y$ g加速matlab运行的三重境界2 G/ D* i ?3 _/ }9 h) s- d* k
一、 遵守Performance Acceleration的规则
% ?5 P; }) j" |# V6 {9 @8 [二、 遵守三条规则
+ ^3 m& ~8 e/ _) C: e三、 绝招
. z( X2 W; p" \$ `. H3 l$ c
一、 遵守Performance Acceleration的规则6 x; f. q5 ^0 M" e% Q' ~
) C0 Q8 q9 Q0 b( \4 u, f$ Q关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将" s0 a% E7 f. W1 J- o3 f5 G: I
其规则总结如下7条:
( M9 j& z: L7 [2 |# S$ r1、只有使用以下数据类型,matlab才会对其加速:
0 E. ~; W8 m1 w& { k C3 N# h. ~logical,char,int8,uint8,int16,uint16,int32,uint32,double
/ [* P7 M5 i4 s* q而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
$ l6 |/ Q" s+ d$ n: Pre,single," y2 C1 z. y% _7 d8 z
9 P$ M9 s* r& }1 g5 S; G' F6 afunction handle,java classes,user classes,int64,uint64
, f0 M% u+ ? `3 a6 b; Q0 G+ o9 p2 G2、matlab不会对超过三维的数组进行加速。( U, a& M# w1 k! T+ d
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值( X6 D3 A# r) k
来表示;
' b. X' K1 R+ \! c: }, Mb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
& h6 l" x; ?8 E+ e. ?/ g# V1 D据类型,只使用
# q5 {: C' ~2 W三维以下的数组;c、循环内只调用了内建函数(build-in function)。
6 `; _! E) u( S0 l7 }1 t/ s+ c4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
9 _4 B6 I3 J% N% ^# R$ D9 N, F加速运行。+ a- ]6 F0 ~5 k$ {$ X5 \( S
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:8 `, E3 e( A7 ]" H% A W
x = a.name; for k=1:10000, sin(A(k)), end;
: a/ O6 ]! p# E ^* C, K4 k X2 d" _6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
4 z- b! u2 ^" W- X3 t度。
' R& X$ u2 l/ R7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
/ j, D2 L& H! C5 D1 M运行速度。0 R H1 t7 q9 R7 T' c0 {# Q
2 ?' ~& L3 [( U: [
& \. J6 o& v8 u& }+ U6 Y
二、 遵守三条规则2 |, z9 v' S. J5 A' X" l, m
0 N' l: T8 u3 h5 c" U7 V" t1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic) T% {9 T! F8 m
h means it is designed. K/ X+ K( Y5 J4 z
+ S D' l \/ k1 afor vector and matrix operations. You can often speed up your M-file c! J" T' u4 U8 G- W/ ^4 b
ode by using0 I9 p+ f) ^0 ^0 P2 ~& P
vectorizing algorithms that take advantage of this design. Vectorizati+ j" D- ^- Q, @7 g2 v0 p% ^
on means converting, C5 l3 M4 o. F( O: O( l/ @
for and while loops to equivalent vector or matrix operations.”。改进# S. A7 v) |+ d) j
这样的状况有两种方法:
# W6 C/ ?0 @2 @( _, [' V6 u$ u3 I( J( E, Y, W v6 O7 L
a、尽量用向量化的运算来代替循环操作。如将下面的程序:) W7 K8 O* A d4 g$ T
3 `# s& s! F/ M+ V0 Z! A7 li=0;0 z$ K4 r5 ]/ p0 ?6 O( U+ W9 W6 E
for t = 0:.01:10
* ~: [7 F1 @& I$ F! _i = i+1;9 F, y2 A- g$ y+ j" Y
y(i) = sin(t);
- x, I. G3 t. _6 vend" q& d4 Y! W# r# n# f" k* \1 w' L
替换为:
: o' d( @& C! i0 S4 F1 bt = 0:.01:10;* q2 }( {" Y5 E" ?
y = sin(t);4 x5 }5 G: o8 P+ p; M, _
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i! [1 O8 u/ Y0 ~" t" d* I
permute、permute、
0 U' l% i' a6 C; t# n6 ireshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums7 Z p% \. c) H% r: Z g
um、ind2sub、
8 u6 o" T$ \* a' Z; r% R& endgrid、repmat、sort、sum 等。4 ?( I& s( u2 d! {! W8 A- O
" o( s5 F# z2 Q6 @请注意matlan文档中还有这样一句补充:“Before taking the time to
. H+ D$ y( x5 M% ^/ \/ w5 W- B! @( l& l9 H n
vectorize your code, read the section on Performance Acceleration.
2 o+ t5 Q5 Q Y5 f% q; K9 H- lYou may be able to" f* I* Q" w. u I0 e3 j
speed up your program by just as much using the MATLAB JIT Accelera
4 u4 I) ?; P; Htor instead of" F1 X2 L; `( u- o8 f
vectorizing.”。何去何从,自己把握。, M- _* {/ l0 F
1 J# I8 S4 u6 N# Z# jb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执/ P; l' K- q. H8 v
行循环次数少的,3 G2 D! {2 v3 Z W' R1 U6 c
内环执行循环次数多的。这样可以显著提高速度。+ V4 U+ t* ^1 C7 }
0 J3 g# r: | s- C. I9 Y- A. Q2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
1 G/ H8 w* m% j# P$ kes、cell、struct、* v# s- I6 ~% ?2 O& ?
repmat等。
" P- _& u+ b+ tb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:( A0 M; ]4 a1 m+ h9 Q/ i
) u1 n0 L) W+ K2 w0 F
A = int8(zeros(100));9 m& b( U, L' B3 ^' Y. R
换成:2 N& O5 l( O: m# J7 W7 A* @9 ]
A = repmat(int8(0), 100, 100);1 b" A& B n- O" T6 V" j$ `: g" Z
c、当需要扩充一个变量的大小、维数时使用repmat函数。; B7 u- B, W! d& l! R+ c$ S
5 `' g. z H8 @1 l
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。7 N& p3 Z0 k) D J
b、使用Functions而不是Scripts 。, ?+ |0 r0 {, o! d# V
9 z1 i% P$ u' O5 K! g: `# N! u8 d/ Q3 b/ e
三、 绝招
9 T9 U9 Y+ i) {. I* B1 o1 a
" g% B* \6 E% x) O" p你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
7 S. U) y J- e# ], T1、改用更有效的算法6 P, }) j( {+ t0 y
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。" g2 d- \# w# Q& f A V
5 U8 g. f" s w$ O8 o
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
1 ~8 B8 R+ R9 @% b语言文件,VC编译”。 ( L, `7 S& q' I) u+ d( M4 B# U
|