本帖最后由 厚积薄发 于 2010-1-25 22:54 编辑
! s6 \; m; g% t/ I# z. \* o% Y- B3 k- Y8 x8 c6 w
加速matlab运行的三重境界 加速matlab运行的三重境界
( m: B: }; h' @& i. l%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%& C1 m1 \6 l* R3 {# O! j
%%%%%%%%%%%%%%%%%%%%%%%
$ M. w: Y3 ?: ]1 v8 R& O9 H一、 遵守Performance Acceleration的规则
2 D. V \0 t0 z* `/ p) M二、 遵守三条规则9 N4 ^- |4 S+ M; h2 q3 |
三、 绝招" S3 t$ {$ m: L$ b4 W$ o& K7 k
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%, I& A8 W- V! f2 }
%%%%%%%%%%%%%%%%%%%%%%% 一、 遵守Performance Acceleration的规则
1 M5 r3 \2 ^5 y' F0 ^! F, |关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
' v$ h: j8 C" n7 ?( H m其规则总结如下7条:* {. R+ T' Q- z+ S6 G
1、只有使用以下数据类型,matlab才会对其加速:: }' K3 C' Y i8 [8 v% ]
logical,char,int8,uint8,int16,uint16,int32,uint32,double9 b& ^! I C. P
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu( \8 i- g. o& D
re,single,$ s4 H8 X3 \3 }) i9 U
function handle,java classes,user classes,int64,uint649 { u) S+ H8 c* t, X: r
2、matlab不会对超过三维的数组进行加速。
9 ?7 f |' I2 I8 F$ x$ d3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值+ I4 Z, V3 g# r* f
来表示;( U d2 K! L0 W% a8 M
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
8 @/ w9 Q- E" j7 Z2 n& q据类型,只使用
J O4 a) s8 d' o三维以下的数组;c、循环内只调用了内建函数(build-in function)。
- @+ Z& `5 j; A1 k( W4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
4 {- C3 d' s0 c; f' x加速运行。% N, g6 q* m% o
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
. t! j% l* ]$ ]% {x = a.name; for k=1:10000, sin(A(k)), end;; V/ j9 X P0 ~4 e
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速( H8 Q4 Q3 x# z
度。: S+ K6 n7 L) ]1 n+ L
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低* B2 y8 y! {- f; |
运行速度。' u7 I* a3 v$ C( Q) n6 d. ~
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%" ~+ s b2 I" L$ ?8 U" g
%%%%%%%%%%%%%%%%%%%%%%%
, s$ h5 y: p0 U* S二、 遵守三条规则' }) ]) K# m% O. ?- Q8 [3 I
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic1 l9 z6 I6 J: H9 m: D
h means it is designed" ^5 O+ B6 ^. S; _% [
for vector and matrix operations. You can often speed up your M-file c
4 t; p5 K) @. b$ d9 l4 Y8 bode by using1 L! H% F. V* M7 h# W$ B& w
vectorizing algorithms that take advantage of this design. Vectorizati% I+ e4 W) @- b( r! E- i
on means converting
, g2 Y. _& |- {) w$ C* c+ g* efor and while loops to equivalent vector or matrix operations.”。改进8 v2 B. a @% i! Z
这样的状况有两种方法:
6 [! t$ h& ^* a& O8 La、尽量用向量化的运算来代替循环操作。如将下面的程序:
* m, |9 E* v" h! m1 \& ~i=0;$ g7 x$ W( H7 P5 Q' s% q5 B
for t = 0:.01:10
% q, f& Q+ P- m, C* \i = i+1;) I; b Q F& ^8 k. j2 U4 W* A
y(i) = sin(t);
9 C, {1 H0 A, \0 O" O+ [: H) tend$ _: j& ~1 |8 @, q! l& X; i
替换为:2 \. P7 O/ N; l* t+ l/ U
t = 0:.01:10;4 D: A1 ]) U+ M+ @
y = sin(t);9 I$ Q* s. ]. J& l! ^8 P
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i9 a6 W9 g7 J% _
permute、permute、
7 X7 F' u4 E# z5 l' L: treshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
; z" G. m3 \- [um、ind2sub、
5 G- ^$ z- Y$ y4 [1 O0 ?ndgrid、repmat、sort、sum 等。1 a& d! l6 q$ B0 s
请注意matlan文档中还有这样一句补充:“Before taking the time to
& }$ ^& C- B3 y: }& e* m, i. [3 tvectorize your code, read the section on Performance Acceleration.
4 H9 U$ v ]0 k& ?' i* d) ^6 RYou may be able to& R H% p1 P& g- b) ?
speed up your program by just as much using the MATLAB JIT Accelera3 r) ]+ [% q" \" q: [0 F
tor instead of9 I( p0 T) A4 Q8 d# D% } Q
vectorizing.”。何去何从,自己把握。
' O) k9 E9 l! qb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执: L" f, M" ?( W8 |4 [
行循环次数少的,6 j9 k( S% ^ U" J1 n! I. S C6 Z" S& K
内环执行循环次数多的。这样可以显著提高速度。
4 ]9 U+ F- r5 J; }8 |* I6 l! q+ S. p' w9 _2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
9 x: h# l J" `: m9 Yes、cell、struct、7 q% F& c( j* w* e0 C
repmat等。6 [" P$ R' I9 ^8 Y! L* N
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:, T6 [$ C2 n i2 ~, K2 ?
A = int8(zeros(100));* K i& ~ t* G
换成:
/ _2 x( `1 H. i" `A = repmat(int8(0), 100, 100);2 {. [& p3 f( B
c、当需要扩充一个变量的大小、维数时使用repmat函数。
% k* ]( {; \: R. {4 Y3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
# }/ x0 E$ v& ^+ q+ _' Zb、使用Functions而不是Scripts 。
! Z, S4 O! {$ C) A3 G% k Q%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%2 `8 R j4 R2 q" `: n% J: g; Z+ h
%%%%%%%%%%%%%%%%%%%%%%%3 N4 s1 u+ I" X& |
三、 绝招, F7 n+ C) } C8 Z6 ?
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。, L( ]0 s, c$ O, H4 S7 V/ }
1、改用更有效的算法
5 V$ {- l, T& | K2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 " A$ w* {$ j3 d" @
$ @! d- y" y8 I8 ^
来源:iLoveMatlab
8 W- b& B, f" `0 f% [; N& _
" L7 z8 N! r6 G0 f8 { [2 w) ]+ J1 |; @ M/ ~$ s' s
在这里本人推荐使用‘绝招’。 |