|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab" r! j2 q! M) q5 ?. q: V
标 题: 加速matlab运行的三重境界
% Q/ V! j, K& P$ m+ ]发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)6 I1 H, }8 V' ]3 T9 y4 ~
, I7 d$ c y1 U: c$ d5 J$ X
加速matlab运行的三重境界
. a) M* H- E6 C& J/ ]9 ^; n4 a9 X- W" v' m
一、 遵守Performance Acceleration的规则) a; ?4 N, Y5 X! d
3 H- v) a3 `/ ?2 c
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
5 \2 H. J: w- n) L0 E5 ^2 G. E, a其规则总结如下7条:. |: J: G1 Z4 m1 y" |: V6 t
1、只有使用以下数据类型,matlab才会对其加速:4 k7 w4 @, P" e' N6 W5 J
logical,char,int8,uint8,int16,uint16,int32,uint32,double
0 Y. ^( n0 b7 |; Q q而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu; i; Y4 l* F8 k( J! C4 z$ @8 V
re,single,$ ?7 ]" a$ i& T5 I: g
/ Y& {' S' Z8 W
function handle,java classes,user classes,int64,uint64
( ~% @2 j; t' L1 @4 l1 C2、matlab不会对超过三维的数组进行加速。5 v, n9 I, ?- F0 _) [# M9 K
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值9 L$ k/ K5 @. O/ n0 P
来表示;
5 c$ }! A! q7 L- D8 m7 F- X) N/ Q$ @b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数4 _0 T; A% l8 h. t6 T
据类型,只使用6 m3 j$ V8 f# L; H+ Z+ [
三维以下的数组;c、循环内只调用了内建函数(build-in function)。* d/ F; ~4 |* |! Z6 k# J q
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
( O, q- [2 L2 M% u7 M加速运行。
1 h6 n/ A' w4 n4 T9 P0 J b5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:- I Q3 I* O4 F- E8 u
x = a.name; for k=1:10000, sin(A(k)), end;2 G( Y% d+ n8 v1 b1 b% k) X# C
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
7 T3 s/ i5 _" B1 d度。
( U& l4 h& }+ c+ ^& M7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
: i$ s9 n: a8 q+ s运行速度。
! o- ^- W. e& G6 \; Q0 l $ [& {' n( ^7 h7 j' o5 V0 ]. Q
二、 遵守三条规则9 r) U2 } Q2 ~- i7 h0 b) d
, `2 X+ K3 ]/ f1 ^8 q8 F. g1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic) I; p/ L6 s# B2 K. B9 Q1 O" E
h means it is designed
, P0 v) z$ _# W5 }" ^3 t; O% _8 p- g- ~3 G+ L4 J
for vector and matrix operations. You can often speed up your M-file c( C! S& P, k0 U6 l2 N
ode by using
$ J' V s% E# ovectorizing algorithms that take advantage of this design. Vectorizati$ W# R% [1 I$ ]! ~' u1 @# H& O1 i
on means converting
( K; m2 L9 h; E [: g" b: Y5 Zfor and while loops to equivalent vector or matrix operations.”。改进
/ m5 C3 r5 D! {. N; Q( b这样的状况有两种方法:/ ] C& O1 b- u5 A
+ ^0 J9 D5 D" sa、尽量用向量化的运算来代替循环操作。如将下面的程序:3 b7 _; o' w, M
@2 k8 ?8 Q- D* c7 {+ I2 B- fi=0;+ b4 X, k( a6 m, s% D) \7 X
for t = 0:.01:10
3 _' L( N$ T7 K) ^8 Ei = i+1;
; y, N4 G9 Q$ Q% \0 C; xy(i) = sin(t);
" ?9 \# f" N: P: a& a5 wend
; w# j1 m: R5 v0 L1 r! S替换为:* v! {" d$ }' ` y, H E2 b
t = 0:.01:10;
% H7 y; s/ b/ R# L; ny = sin(t);
3 Q2 e! F/ I8 m速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i+ C1 i- [& w' h6 a% D8 t* ]9 M
permute、permute、& W/ }) x0 W8 x( ^
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
0 H( [" z% |9 d; s; d6 U1 C/ P! }um、ind2sub、9 i, C1 k* o; n
ndgrid、repmat、sort、sum 等。1 w1 }' }' T! k r- Y0 p5 ~
- \% M' |9 |8 ^' G6 a请注意matlan文档中还有这样一句补充:“Before taking the time to8 l( a# r( W! ]
1 f$ L/ w$ A: Z, Rvectorize your code, read the section on Performance Acceleration.
; n# d- g; ^# S6 Q2 KYou may be able to
7 e# Z. ^5 }5 m# Jspeed up your program by just as much using the MATLAB JIT Accelera
! P1 s) X1 `* P: b% ator instead of7 s" K5 `. N" \8 V6 I) _
vectorizing.”。何去何从,自己把握。
) F) H9 k: I1 Q0 e& @5 H6 T/ g! R3 v- \2 W
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
1 I# m! O( s" }: m, V# X: X行循环次数少的,
* `9 M! O, m$ A2 j& {% Y; N内环执行循环次数多的。这样可以显著提高速度。4 R* X# Q8 X% p+ I! j6 r+ V j3 r P
% N6 b; w5 a' Z
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on! Y8 H4 ^: m$ ^9 u+ k/ Z8 Y
es、cell、struct、3 g4 E9 T9 {9 D
repmat等。
1 |& c' Y3 n/ p: \8 a, g) Eb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:9 q2 n6 g# A9 @1 g8 j4 v
& T) ?0 L$ H& _
A = int8(zeros(100));
- d: j5 M- N/ V: F4 H) \换成:" T0 I* f, t& X u) n+ i6 W u
A = repmat(int8(0), 100, 100);
% V0 V" h: v6 |' Sc、当需要扩充一个变量的大小、维数时使用repmat函数。( u9 b' K1 X% f1 K) l8 t6 p
; R7 a, G( z8 x6 C% d+ |- W3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
+ j$ m d3 j6 u# zb、使用Functions而不是Scripts 。
* D! r/ C2 S* ^# |: O
3 A* {! R/ i7 ]5 s# _. [$ a三、 绝招& ~, W- F: @% h, Y
+ F- r4 {# a8 Y$ o
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。0 w' I" H- f6 [1 H; s
1、改用更有效的算法
5 g7 d; l" j, T& N. W( A& [1 u2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
1 X1 C+ n$ k7 a3 j1 r$ Z& E1 m; d0 h, t( |8 Z
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++" M& p1 S3 c5 N, K9 b& |
语言文件,VC编译”。 |