|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
3 _6 M: Y1 R- w* B标 题: 加速matlab运行的三重境界4 L1 i7 f, ]( ]8 K2 t, Z) Q1 a
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
! M4 g& \& F' E. |; a- w4 x2 `
! [0 o* v9 W2 s3 z' t: A! Y/ A加速matlab运行的三重境界
9 J& G& o6 }) o1 Q/ d) u6 E2 I+ J) \4 V( f4 ]7 p- ?
一、 遵守Performance Acceleration的规则
& @$ @! Y" P4 N; d! C
) o N8 J3 U h5 W4 r: k关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
! B( z% O9 u, k/ ?8 {其规则总结如下7条:# n2 S& P" z. D4 q5 V
1、只有使用以下数据类型,matlab才会对其加速:
8 a% Z' _4 k# Ulogical,char,int8,uint8,int16,uint16,int32,uint32,double2 U9 A: o8 b( Y. L
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu, S3 |' t8 o! B- n4 ^) P" |0 n
re,single,
: N0 P# [; [; D/ U' K' u) m, Z
- j! L4 U6 Z/ o$ Z2 l1 s4 _function handle,java classes,user classes,int64,uint640 r g$ u& Z- O7 k4 Q4 s9 u
2、matlab不会对超过三维的数组进行加速。1 |3 f: t& U# K5 ]
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
$ f5 g0 W1 S/ U8 h: Q3 t6 N" |来表示;
5 S. _5 A7 f6 V/ E9 Tb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数: D% z- v$ A2 Z# u) @' {! q) @
据类型,只使用
. ^: P" v/ r' r- W. l4 y+ a- K三维以下的数组;c、循环内只调用了内建函数(build-in function)。4 I- t4 V6 ]* p" a' _
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
4 P5 @; T8 t+ H+ R( ~+ v加速运行。- N# ?! }' w( ?/ e0 ?) ^
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:& d: \5 ^; x4 @* k
x = a.name; for k=1:10000, sin(A(k)), end; L) n8 Y8 G* p$ R( k
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 ~# q% i) d- x$ o; n8 Z! y. y
度。
* c* E2 l! U9 S& ?% F3 ?7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低# V& |6 Q$ t' P, d# X' ]
运行速度。
+ P. C9 d% Q q0 K; D & f7 A( |' w* w. l
二、 遵守三条规则
. E* {- r/ q0 W$ z2 K4 a t
9 P; m% e1 H* Z' n" W1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
1 y- K* s- ^& u+ m7 M. wh means it is designed
7 E! x* l8 s, d) v
8 K7 f; K) ~9 f2 u/ W& Yfor vector and matrix operations. You can often speed up your M-file c
/ v: ^ S5 ^; d' `4 pode by using% H$ n4 t5 ~) |6 @& t* H3 b. }3 D
vectorizing algorithms that take advantage of this design. Vectorizati6 T" |. w6 n9 m. G
on means converting5 g; U- k) b/ X* A9 j
for and while loops to equivalent vector or matrix operations.”。改进
5 \4 p3 E3 Y2 l- I+ M9 ?/ t这样的状况有两种方法:) k8 O: B1 n: S
) w1 w7 q4 u6 C9 K- f$ [a、尽量用向量化的运算来代替循环操作。如将下面的程序:
) t* P& b) F, X
. y ~: a |6 y. p" W* W: Si=0;" Y& l' B# J: i, \% V( F" L/ O/ S9 m
for t = 0:.01:10
# p% T9 z6 `4 d: o' E2 e* n: ]i = i+1;% U- c5 h3 g% n8 p# c
y(i) = sin(t);
/ ]2 v8 Y6 G4 @7 `- _' Wend
' }4 I; E# S! G+ ^) l2 y) a4 g替换为:$ s( X" ]5 H2 h, A5 @" u6 ^7 m% z3 e
t = 0:.01:10;% b) V ~" y ~3 r8 x& b% F
y = sin(t);
, _3 z% ?9 S& T4 ^4 I% l速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i6 X: R& O' ]5 d$ {6 k* _
permute、permute、
) m, |. B3 {. }& z2 Xreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums( N8 h1 c0 z' i1 ?' R7 N# q+ p
um、ind2sub、& S$ W4 c# t1 k) `: K4 d7 n) M# J0 a
ndgrid、repmat、sort、sum 等。5 K/ V5 z5 F a0 S; S# F$ |: Z
) [3 Z1 b: v- ~- {4 R7 f. A请注意matlan文档中还有这样一句补充:“Before taking the time to7 z- w5 y: d- d. b) \: o+ D
/ Y+ f4 A# D/ ]* H
vectorize your code, read the section on Performance Acceleration.! p V+ }/ K# l( z" u, H) O2 }. r2 @
You may be able to; G7 v- A7 z# `1 o; X
speed up your program by just as much using the MATLAB JIT Accelera
* C& d( K( P/ F& n8 Y9 ~tor instead of
1 `# j# ~+ q$ `9 z% xvectorizing.”。何去何从,自己把握。
2 V) K+ g6 ]( a- B
( C* v5 Q5 L) W. wb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执: b( c i& V, |: u- ?2 J3 Y
行循环次数少的,+ P. o I, E! r+ C& T
内环执行循环次数多的。这样可以显著提高速度。+ h' h( K/ k: O9 u4 {: T, D- ^
2 P/ a2 J- A8 N
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on- U8 q! u# i/ m1 I
es、cell、struct、: E/ @7 G2 s7 P$ u1 }, N7 k
repmat等。
+ E; Y1 l/ f- }4 y' [# nb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
2 o, H2 |! u- R8 U1 Z' U9 S2 I& n% q: A4 z! c7 F
A = int8(zeros(100));/ B7 q) g; s. k; Q: r
换成:4 |2 G5 ?1 @5 p! |
A = repmat(int8(0), 100, 100);5 H) H( v3 a M. x B4 T
c、当需要扩充一个变量的大小、维数时使用repmat函数。5 b7 p0 E# t, |
; V, W0 C' Z4 R1 V0 K/ U* e' R3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。3 v4 d t- a6 z* i
b、使用Functions而不是Scripts 。
4 T& }- `6 g* @" S: R. U' V+ z' n' N 1 E- H) U7 E* O' W W
三、 绝招( v$ N7 w* T N- T- y/ ?
9 P8 d! ]! Z3 _: A
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
8 ^+ v7 L$ d3 x1、改用更有效的算法0 s7 [2 j+ e9 Q% O0 Z! q
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。6 B( [4 Y/ k3 V
1 R7 O8 n' `& G/ ?* U1 ~; B关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++' a! z" u0 V& W e
语言文件,VC编译”。 |