|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab) A# ~. i9 C- p2 j+ {$ D
标 题: 加速matlab运行的三重境界& S5 a5 k) ~# T1 u' P. B8 {, Y
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004); s" T- L. C, z' s
6 q6 B$ h/ L1 Y( K% U加速matlab运行的三重境界
# h# a. u" w% |# K- d! ~- @- S w4 E9 K
一、 遵守Performance Acceleration的规则
% }% P3 r$ F: H
2 d* w* R+ G6 J# w( {: w- g关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
* {9 L$ K# q; e- D其规则总结如下7条:: m; D7 Q1 \4 N+ V
1、只有使用以下数据类型,matlab才会对其加速:" S+ S7 Z; S1 `/ x. {/ B6 V+ c
logical,char,int8,uint8,int16,uint16,int32,uint32,double
; c5 T7 J5 j9 | V7 n而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu9 `4 |, F- c% X: h% m
re,single,
; A+ ?( N$ J, ?
! o6 |1 W1 m/ p z1 |* i/ z) bfunction handle,java classes,user classes,int64,uint64# o( G k. P$ u6 R8 w# |1 `2 B
2、matlab不会对超过三维的数组进行加速。
% S+ L+ ~6 `; V! O a7 s3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值5 {* s. p. O1 e- R1 k
来表示;4 ^5 S# G! v" Y0 j
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
' U1 }$ D# V/ U据类型,只使用9 r* [, m, Q3 n8 q5 I& p& I
三维以下的数组;c、循环内只调用了内建函数(build-in function)。7 [# D) w7 H" S8 ^ F
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
4 c' q& p8 u8 b3 V- M3 l1 }加速运行。/ V! [$ }$ s5 {! n |' f8 j
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:5 e3 f3 q: i% d; a9 S
x = a.name; for k=1:10000, sin(A(k)), end;( Y" r' t; ~) e/ `- U0 G
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
$ R, C& S9 F+ o; [度。3 @3 ?2 \! W0 s. @$ k
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低- e7 x& M) t; {6 a+ c5 l- Q
运行速度。+ E& d1 Z$ f# }" }0 y3 ~' ]
) o' e, |: L8 _二、 遵守三条规则" P: H& m. H$ s) h2 g+ A, w4 A
7 O# _) J% o0 a5 U* f* ]8 t! o! h* J- J% ?1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic. b; O+ R* N3 M9 K0 n9 q! {% ?
h means it is designed
. R5 Q# ~1 n% w+ L" u9 Y( `3 F/ O" z* e3 ` w$ G( M3 ~
for vector and matrix operations. You can often speed up your M-file c
4 O; e9 |1 b% N, ?; E, ^" V! c& N Code by using( {9 ~! ^7 m1 h" q
vectorizing algorithms that take advantage of this design. Vectorizati
0 ?7 s" b b- W. jon means converting
3 U7 D* E8 b0 U& Z( r# J5 |2 Wfor and while loops to equivalent vector or matrix operations.”。改进# t( E. O0 {# x. h& ^6 y: `
这样的状况有两种方法:
! O4 Y: `2 i( A9 o/ W7 z
, ?/ ]1 U2 l- ]! ~+ Ya、尽量用向量化的运算来代替循环操作。如将下面的程序:
; D9 |+ Y5 I/ f( G+ W- C; I
' i% D( U/ M! z2 T- ]3 @i=0;; L/ P4 U& o4 y( o# h5 g0 }: `
for t = 0:.01:10
, r! h) t7 G$ N ^0 gi = i+1;
# a0 G1 L+ q7 J: I! F ~3 qy(i) = sin(t);
1 m6 U) Q; s/ o: X4 |end
$ X: @% q i5 R& |! W替换为:4 J6 Q. S; l( |) u' @" T, w. r
t = 0:.01:10; R! j ]; \& [# X" a
y = sin(t);
& {+ \9 H- J. m% U7 V8 Z$ T- I4 D速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
0 N5 o% f0 \4 S5 Gpermute、permute、- L; N- C# L+ S" X7 D& p9 {. G
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums1 A: m3 g- s! h, b4 x
um、ind2sub、( E. t0 C8 A& }% ?* c5 ~0 ]: i
ndgrid、repmat、sort、sum 等。 r/ S7 M, A; q* E. M3 j: P
' |: ~' v+ m, M3 X. {9 e
请注意matlan文档中还有这样一句补充:“Before taking the time to
8 B( m1 g; ?9 j5 R
3 e( e7 P' A$ K9 k( u+ Tvectorize your code, read the section on Performance Acceleration.# {7 L3 J: H1 u4 Z
You may be able to
, o$ V0 y2 u% E* ]9 x7 [speed up your program by just as much using the MATLAB JIT Accelera: j6 L1 r5 M& Z+ T$ C
tor instead of
+ N9 c9 {$ @- wvectorizing.”。何去何从,自己把握。
( U% a* Q# g k7 j+ {
+ ?! ?- \, @% o6 N. w3 X3 `b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执7 X* p, i8 a! r
行循环次数少的,: j8 W& ]5 @0 p7 {: Y
内环执行循环次数多的。这样可以显著提高速度。& y" I3 S& l& e0 T- m; z( a% ~
e0 d* ?" f8 c: F0 J
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on3 x# Z n" O0 l* g& z: s
es、cell、struct、! O* z; f6 k8 _, B0 f% O; y
repmat等。
9 L6 u- W w$ Y6 Pb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
; D% v5 ^' ]; r% G) x3 E! E! D. `% M" ?, s& A r u& A9 T
A = int8(zeros(100));' H+ T& T6 n. O7 ~
换成:
, E; E, R. W" {4 b' ~A = repmat(int8(0), 100, 100);" e, N! C( Y' \1 g: I+ A# z3 e6 F
c、当需要扩充一个变量的大小、维数时使用repmat函数。% m' J- f" g& x: U s
+ ?# A1 {9 A! `3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。' y) l. E, y+ k7 m7 y! C
b、使用Functions而不是Scripts 。
( f- {" t5 ~- q+ b2 _) z V % M# S0 h9 }' | z( }- p
三、 绝招
! u; ^+ ^" N: s- u+ D6 o/ T
7 ^2 Y! a; \! P# v你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。. _, G/ H7 X8 y( u5 |1 O- \
1、改用更有效的算法
" I4 D9 g, r6 ]0 W$ h% A2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
8 g5 G3 K l+ c5 b2 T5 L3 B( J) P E7 [# F+ x' [. ~9 m
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
% @6 @! v$ ^$ c$ [; a1 c* Y" {8 L语言文件,VC编译”。 |