|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab% Y( b9 j$ y) w/ |; z" _5 Z! s
标 题: 加速matlab运行的三重境界0 Q! G2 U$ k% G1 d: w
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)2 l7 m7 U1 F/ A7 G% A
V. X7 N- K' | q; o; _" [" M
加速matlab运行的三重境界
# m- V" N4 F% k2 z- P6 t( u$ [1 s& u4 K' Q
一、 遵守Performance Acceleration的规则# w# H& W% n! [6 ~3 {9 p8 v/ N
2 f, x% [* J# t4 j4 u
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
l2 g. W- N9 [# V" [9 r5 i/ Y其规则总结如下7条:
- h- \, L; C4 I* u& @1、只有使用以下数据类型,matlab才会对其加速:$ U! w3 b! h; Y9 B
logical,char,int8,uint8,int16,uint16,int32,uint32,double
# Z2 Z+ q3 Y9 |8 m* E8 N9 h而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
* g1 N8 G, Z" d9 c% }" c+ H6 lre,single,
" \1 j5 v$ v9 n" Q$ W/ s( e5 U. D5 i0 F6 v
function handle,java classes,user classes,int64,uint64# E- m" ~2 I4 q+ E4 M& [$ n
2、matlab不会对超过三维的数组进行加速。
: D; _' e2 b. g, l3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值8 N* L0 t0 k C% y: H& V
来表示;
! B6 T# R. T W8 Q% @! d3 n7 Sb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
. h6 } B* D# X7 N+ x; K$ M据类型,只使用# W0 D: y1 \5 `. L
三维以下的数组;c、循环内只调用了内建函数(build-in function)。8 }( h9 `7 c; F7 G
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将& q# V, \5 _- S* n$ b# j$ `
加速运行。$ s9 Z6 O, X/ l% K
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
) g% k& N; X; L" a3 g0 sx = a.name; for k=1:10000, sin(A(k)), end;
& Q8 e( y) [6 R6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
1 L# [! T0 q8 B0 K v" U0 j度。
! p# |! r& e4 G- y; H& u7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
3 x5 B. q( O( Y% z. U运行速度。
; O$ K! t' R5 T
/ N0 @' r" l6 y: V* f/ k二、 遵守三条规则
# V2 f6 ^7 R0 T( q0 P5 R; @( T7 W) P& S7 }. g+ I
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic* f& q" E/ E! Q3 q4 _
h means it is designed
( v# A/ [& z; A; F8 E
! F" J: G0 u" v$ Z0 u/ \for vector and matrix operations. You can often speed up your M-file c
) N6 N8 e {8 T& g3 kode by using
2 d% \: X4 |+ @& \; Uvectorizing algorithms that take advantage of this design. Vectorizati# G3 d) }: C1 ~9 E h" b! i0 ~* r
on means converting4 `3 `3 T8 @% ]
for and while loops to equivalent vector or matrix operations.”。改进' t) ?5 H0 V) Z9 L
这样的状况有两种方法:1 t% }+ t9 D( R6 A2 X h
6 G/ D1 ^- k) ]4 Ma、尽量用向量化的运算来代替循环操作。如将下面的程序: W7 L$ _! I0 u3 c7 U' b) b* q/ g/ q
0 _- [2 y) C3 i& l) j4 o. t* W0 [i=0;6 y. L6 {' l- e$ L+ h
for t = 0:.01:10
* {0 D0 R: e+ L- }' [- s" ], Ri = i+1;
& b, m T$ u$ t% }% a1 |. R# Py(i) = sin(t);% {! Q; w9 u7 a3 d% P& B
end9 c2 R3 f) _) d0 e3 A. w/ f' U; i
替换为:
+ N l# ^8 l0 h4 W$ U* T! lt = 0:.01:10;
( F' ^+ L2 I0 y6 ^: r, d$ c* d! uy = sin(t);
4 `6 U; g# s' {6 h6 q3 D) Y速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i; O1 u' |, e+ H3 S, h
permute、permute、
) \9 k. r& U. \0 R5 }2 n8 ireshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
5 t8 K3 l% C0 T" \3 Vum、ind2sub、
3 j0 X3 l, f9 q* F2 j3 Hndgrid、repmat、sort、sum 等。' R4 v2 G/ p7 A% A8 g$ U7 h4 R( F. ?
0 s1 i) }& ~6 |1 c- o, q
请注意matlan文档中还有这样一句补充:“Before taking the time to$ A7 v7 s6 t5 w" G& o* y; p. v
+ l' A x. |7 H0 v0 B Y2 [' [vectorize your code, read the section on Performance Acceleration.
" K/ h. T1 n8 P% C" hYou may be able to
4 l2 x4 W8 x& ^ m9 }4 v0 V9 ?, l* |speed up your program by just as much using the MATLAB JIT Accelera! A( n! e9 }/ _4 ?$ t2 `+ w
tor instead of/ I* w, s# `; Q# y( U
vectorizing.”。何去何从,自己把握。
- M8 q1 l6 a( y4 z" X! b+ A% m6 a) Q( Y3 C2 R: n
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
: z5 V. U1 d) t7 ]! Z8 q行循环次数少的,6 ~6 X# E1 {2 p5 V, p7 y; _3 x
内环执行循环次数多的。这样可以显著提高速度。
* D/ U1 }3 x3 U
3 D9 [- t+ ^7 |0 s2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
5 `& d# t5 l, r- yes、cell、struct、
5 Y; H2 e* }6 G8 w- h$ p1 Prepmat等。
0 H( E$ j( d9 c# o- db、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:2 @: _1 o% ]8 m# u# H
% y& Q; C( [4 `2 v+ k _
A = int8(zeros(100));2 B) P! o/ E) t
换成:5 ]- y4 p" k' Q
A = repmat(int8(0), 100, 100);* w+ }* C- T% F6 i p
c、当需要扩充一个变量的大小、维数时使用repmat函数。6 f8 U5 {* Q8 c
' E9 Y% u+ G- y0 ^" Y- Z6 k- `3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
0 p! X4 p$ m [1 N, u9 @b、使用Functions而不是Scripts 。" h- j- d& s$ P7 j8 S; [* k
9 d: I6 H$ d" C6 l, d# s
三、 绝招
! e( x$ g5 H' K3 g1 D" }" Q/ }# q( h: `/ _4 }- W" \& i: Z+ `% t
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
! u1 Y9 ]! L: [5 H1、改用更有效的算法, d! Y- w* [/ I" T
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 t6 V5 a8 {, ^% y' ~) o
. K W7 X, A2 k0 e+ x* K T8 n关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++# V# J7 \8 y* ~! @' Y( o
语言文件,VC编译”。 |