|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
2 X9 t4 o5 u2 c' G标 题: 加速matlab运行的三重境界
; m# Z. U1 C- a- ^发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
s9 Y+ {9 Q" n$ @
3 x: B* d! ^6 B6 Q+ F/ n6 j+ H加速matlab运行的三重境界 1 l2 V" J4 R) ^3 [3 ?' P
: M! C: }4 s8 b3 @一、 遵守Performance Acceleration的规则6 `$ b$ F: D8 T% [* D+ h9 y, O
; f9 B/ `' |& C' v Y关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
2 a V2 |0 s* Z7 ~9 a) b9 g. @6 t6 P其规则总结如下7条:
" \( l6 ~ H$ s: L. o1、只有使用以下数据类型,matlab才会对其加速:0 ` M- T/ _8 m& x
logical,char,int8,uint8,int16,uint16,int32,uint32,double3 Q6 z8 {) r, v2 h% c# k
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
/ Y; m/ |4 y" D& K: @) wre,single,* B$ Q% m U$ h7 t( U' l. x6 w
1 s( [) ~0 I1 ~# u7 f' M% R1 Pfunction handle,java classes,user classes,int64,uint64
# D6 ?$ u4 B. `& B) h u8 x/ T: s8 F2、matlab不会对超过三维的数组进行加速。& l5 o9 ? X' w1 C
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值3 {7 z0 V {. \
来表示;
& k- B( [. m/ Hb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数" ^) a7 `/ A$ x
据类型,只使用
, @: e7 s% i9 ?1 `三维以下的数组;c、循环内只调用了内建函数(build-in function)。
8 H7 j# C& M6 n4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将7 m- a# \/ _0 d/ F y
加速运行。2 n6 J1 P" e/ ^/ m' S1 X; E7 Q# U& b
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
- Y; w6 O1 F! } ^9 Fx = a.name; for k=1:10000, sin(A(k)), end;
" D4 R5 O( b5 b* V% O6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
4 `, S* i- _3 D( m6 K: F度。
- c, e d/ m2 o: \% m5 ?7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
% \. m- r( A3 D4 Y运行速度。
9 x! C) I$ B! e: K+ a' \* b- f
0 W( a- W; n% p) x s二、 遵守三条规则
( U% S$ a- d: u" R7 E1 r9 L5 @! u& W2 K7 x, f8 M2 h: w& C/ ?
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
: L9 I5 n+ W, X+ Fh means it is designed
, ?7 t5 l+ p) P
& [" w' q' ^0 T1 D2 o \* [! b2 Y( Lfor vector and matrix operations. You can often speed up your M-file c
3 }) h8 u- n" oode by using
* _( T$ D7 r0 |. Mvectorizing algorithms that take advantage of this design. Vectorizati* }; M4 q0 D7 E- g/ d
on means converting. K, Y5 V, }3 {) x8 \! `
for and while loops to equivalent vector or matrix operations.”。改进; w5 [$ a Z$ a( M3 W" e, A( V
这样的状况有两种方法:
J1 a1 F8 F( g& Q. Y+ E& J, [ q4 Z3 n8 p
a、尽量用向量化的运算来代替循环操作。如将下面的程序:
: R g" n) F# I. v4 ?: {( l o. e: z+ j9 d! l7 m
i=0;
: E/ p6 e6 i/ c) ~5 ?4 nfor t = 0:.01:100 w/ O* K a/ P# a8 ^5 N# _$ l( v$ [
i = i+1;/ Z( U/ q* M2 O7 A9 ~
y(i) = sin(t);
! ^" v: c; m2 P6 [end( v" u% d* b: S3 [" }# ?3 d3 D; h
替换为:
1 S; Y* x. Q$ K2 x& y. gt = 0:.01:10;
$ e" T+ Q* t) z$ hy = sin(t);
& w5 C7 W8 [4 U速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i2 B0 b% u3 q6 v8 a$ x
permute、permute、
7 p: u% c% c5 a* K, ?. V8 C' X% B2 [reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
1 [- z1 |* Y3 x3 t& c mum、ind2sub、
6 l$ h3 J4 J# h; Z2 |. Y- \ndgrid、repmat、sort、sum 等。
/ `0 a6 E$ Y3 J8 F- o8 b7 H! F6 i* }3 N4 ^, B9 [
请注意matlan文档中还有这样一句补充:“Before taking the time to! J4 u( u6 {& O4 L
0 Q: [2 Q p, w& {vectorize your code, read the section on Performance Acceleration.
4 s( I# L! o$ S6 V3 f, K# U C/ f2 lYou may be able to
% \0 j8 @$ V2 uspeed up your program by just as much using the MATLAB JIT Accelera
, H& i' ]/ c2 | G1 E- L9 Vtor instead of
8 P1 Y1 A- H3 Vvectorizing.”。何去何从,自己把握。6 f# F! S+ {5 x2 S* @ |
5 z6 w& G9 K% i0 Ub、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
2 G8 M' V1 m, g8 F行循环次数少的,: c. B0 d F6 U7 `( Y9 I
内环执行循环次数多的。这样可以显著提高速度。# ]- C8 J i# u7 b: O- i1 X: `: F0 c
( x" c0 {6 K& X1 V2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on* s( N' j6 v3 u5 v1 ^- {
es、cell、struct、
# Z* J2 C: u! [$ \/ b& Brepmat等。& ], A% y0 W" L* ~/ J0 v; |
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
6 I5 f8 }0 c; w5 b+ O# ~ T
4 R3 s$ c2 P, r3 X7 ?A = int8(zeros(100));& A: @, i8 u! M2 Z
换成:5 }, j8 ^3 U: Y. R0 Z) [$ a
A = repmat(int8(0), 100, 100);
# R" K8 X9 E/ {, j4 dc、当需要扩充一个变量的大小、维数时使用repmat函数。1 K H# S- y/ g: H) b3 y8 n* g
% j! N+ G) r9 f; p y6 r, i
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。" `* I3 ?6 B1 ]2 R0 M$ D
b、使用Functions而不是Scripts 。: \' N5 ]1 y+ h
8 d7 `) b( B4 q4 f) w2 ?, c三、 绝招
1 z( |7 l/ s k6 L. l# K$ i
! T+ J. E% A5 T- y7 H( e$ T你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
. X! f& s3 R6 N1、改用更有效的算法
; | ~( y" s8 I* m2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
# G+ }8 B" F6 h( o X5 m
6 v+ N$ _) `% l关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
$ G1 H E: E' H5 u4 y0 u语言文件,VC编译”。 |