|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab1 b6 S5 ?+ |9 Y; N
标 题: 加速matlab运行的三重境界1 g# O ^: P1 f' a. L5 K) l& i; V
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)* p' c: s+ k/ J/ @) S
# C$ A1 _* ^0 g) x9 C2 A加速matlab运行的三重境界 ' V) X2 O+ X& b$ b' q
7 S- i0 D* R4 M
一、 遵守Performance Acceleration的规则
! n' Z- S, k, P1 F+ H. a2 x
7 f, H- o8 `8 p; H% A关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
1 {& T! f; e" a* ~0 Y+ f其规则总结如下7条:8 \2 Y8 u& I+ ^2 k' J9 b- q
1、只有使用以下数据类型,matlab才会对其加速:
8 X5 D5 R% t. s+ qlogical,char,int8,uint8,int16,uint16,int32,uint32,double
' t8 {0 n) D# I. ~( r6 }而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu5 I7 Z) K. j5 |& h) X. r% M
re,single,
9 W6 D/ W" D4 c4 ^1 T5 Q8 g$ Z3 I: F+ N$ z- W9 \/ \" K
function handle,java classes,user classes,int64,uint64
" a; C5 [" l; N( r7 u) {4 A2、matlab不会对超过三维的数组进行加速。
, q) l2 |- {, ^. D) O, I6 i3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值) F) b: {) ?+ Q `
来表示;
3 H' d, i/ F+ Y# f0 a1 L" z2 ]) [* h, fb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
6 M) ?. A7 C4 H4 S据类型,只使用* r2 p) a' _; F' j! N
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
# C1 A f/ ~0 h+ P" k5 Q4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
4 H$ r4 O4 E5 z6 ^# m加速运行。
0 V1 M; a' \7 {2 w) Z5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
( l, @: |& F( ?+ rx = a.name; for k=1:10000, sin(A(k)), end;+ _7 v3 d1 q! Z! x1 A, L4 E% m
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速2 s& |4 D' _5 l* r% v- q4 E
度。' k: d0 I# D) ^+ I7 W' N9 |: k
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低5 S3 f4 E, X2 M. H/ A
运行速度。7 r3 @7 d% W# j) a$ _
4 Y" U5 e! [* p" @1 Z: V* y二、 遵守三条规则
. y# x; r7 \7 b5 V9 F& Z! W7 a; c. P$ _* m
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic8 G# T5 z: j; H4 T( `! t8 D
h means it is designed+ J* W0 P! Y3 X2 F( [- S9 x+ _
9 r; Q( h/ ^0 m
for vector and matrix operations. You can often speed up your M-file c5 w- L7 x8 z; H/ Q% b5 ^
ode by using; Z* b! \4 R8 x* m- H$ y; k/ F
vectorizing algorithms that take advantage of this design. Vectorizati) f: T4 M( s; q
on means converting: k. _1 o$ z+ p3 v" N" _
for and while loops to equivalent vector or matrix operations.”。改进
& T+ U$ D/ E$ O. ?( b6 b& B1 Y1 K这样的状况有两种方法:: Y9 u3 V4 c4 e+ ]2 Y9 ^* ^
2 O5 p( p {, Z: g# T; |0 ?a、尽量用向量化的运算来代替循环操作。如将下面的程序:& C# ~4 }4 ~4 x$ G9 @' k. b% Z) T
0 f% x. H. h8 l: p( s: e3 K- c
i=0;9 |% L( w" |4 I2 l, n2 ?0 K
for t = 0:.01:10; ?. S4 l$ _. T; U9 {; r
i = i+1;% ~# a) E! ]3 E9 Z
y(i) = sin(t);
: e( E, h/ t" d1 ]1 E; x& C# fend ]7 @& L; L" |# u% d: {
替换为:% H9 i* @! e5 A- p+ D3 l
t = 0:.01:10;
+ }0 f5 ?" U( N0 {. z; m% q. X' Ty = sin(t);
1 z& D# W A& P速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i* `9 T1 Y* l( j' ~
permute、permute、/ L/ Z4 V" ]5 ^" c5 Z" n
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums0 X) V7 e* u3 n) E' Q- j
um、ind2sub、, O2 \" e* P! ^# e
ndgrid、repmat、sort、sum 等。
: `: A+ T1 T% y; [/ U
3 G/ V. o& N, h请注意matlan文档中还有这样一句补充:“Before taking the time to w o+ P) @. C4 H H0 ]( p5 X+ d
5 {0 L" t; k2 }vectorize your code, read the section on Performance Acceleration.
3 \9 |9 `: K1 J% MYou may be able to4 _3 {1 [: P& m' Y- x3 J/ \$ s
speed up your program by just as much using the MATLAB JIT Accelera) l# N& P' ~6 {- q7 z3 P" K$ b
tor instead of
7 Y6 I& D! M) _9 ~vectorizing.”。何去何从,自己把握。' u, y: ^" ]9 j _+ b6 i4 X7 H
c6 R. |( [ [* x
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
& i* H( D: J8 f: ^+ l3 H行循环次数少的,
: w2 B) B/ j& Z7 O' p, Z0 e, D内环执行循环次数多的。这样可以显著提高速度。
9 ]3 Q( d- y1 X& N+ @8 R
9 c- u t7 h2 K* L, r t$ c: _' V* J2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on1 k& `1 {5 R# x* r
es、cell、struct、
' w9 M: D7 W1 s3 }6 i/ P6 z/ xrepmat等。0 ~$ T- d. ?5 [& R
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
Q; H3 `/ |. o; f) M3 E8 I0 o1 c' i( Z( L' Y
A = int8(zeros(100));3 i# ]$ ~) f, Y& q
换成:
6 H* Z/ f; r; k* Z% mA = repmat(int8(0), 100, 100);
# j [; \7 U' |# f' ?' |3 qc、当需要扩充一个变量的大小、维数时使用repmat函数。
; O0 t: N9 G& c; L
/ u- L! R; R/ b: e0 |7 M3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。1 h9 f8 K6 v1 e7 _ W
b、使用Functions而不是Scripts 。- U! p2 x7 ?9 Z: ?, p
# ^( Y1 r7 ?( f+ `三、 绝招
, [1 m4 a! G3 C$ b7 H% b, G" _" K3 O. @
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
5 H9 m: V% _+ F& |" S) p1、改用更有效的算法
& m% w/ y2 L1 a! F5 z/ `2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
- M% G. p$ b% m5 ~6 U+ V7 G6 p5 C3 D/ C$ ~- P# V
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
! \( {0 q0 \: C7 {& t" j' f' ]! U语言文件,VC编译”。 |