|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab0 U# a. }; P/ F: Q, U/ S
标 题: 加速matlab运行的三重境界7 ]" v# ?& v: T6 M! [' R
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
/ ]( \& A9 J( ]' [& Z' J$ T4 X' H2 q
加速matlab运行的三重境界
' ?# w/ T4 \1 f) V, l/ ~( C
$ z$ w; @! _2 m' \4 j5 x一、 遵守Performance Acceleration的规则$ r6 R% O% P. M# K, P4 U
* D; e5 g T" S9 o% c关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
, n7 F" N$ J: o' r4 K- H: [其规则总结如下7条:% v2 m) C. x7 _ L+ x
1、只有使用以下数据类型,matlab才会对其加速:4 n$ x% i" g1 h) \
logical,char,int8,uint8,int16,uint16,int32,uint32,double
1 `/ C1 E, C N% k/ q而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
2 D0 i5 y1 j* R0 jre,single,
9 q8 [" }& i/ G+ o. u1 s2 y0 m+ N* b9 D
function handle,java classes,user classes,int64,uint64
( w& q& Z6 v6 A6 H6 M2、matlab不会对超过三维的数组进行加速。
% a$ j7 @: O$ t4 w' Y o7 \9 w3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
4 y! r7 e7 Q' @, N来表示;. \- V0 V+ k" N6 W
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数8 R. E7 q! p' _& a p1 z
据类型,只使用
9 C8 ]( U* Z7 P6 k, g6 ^三维以下的数组;c、循环内只调用了内建函数(build-in function)。4 K) f/ g4 n3 g! ]# a& ^" G$ U
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
+ a/ {: f! n) [1 I. I- @加速运行。. W" S) @5 I) y# l
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:7 M- W5 N0 K% g( [& U; K
x = a.name; for k=1:10000, sin(A(k)), end;
$ {2 W1 J. V+ v) {( y6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
" C! h3 ^% ?) W9 E度。* w) A& a- F8 l! ~7 J
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
3 p* g0 U8 ]5 Y) u6 I$ {运行速度。& \$ P; k& u0 l2 Z( C
7 U2 x1 u1 _5 P二、 遵守三条规则
, @& a5 R+ ~7 p6 x4 y- H2 T* K* u, T6 Q' }! |( U$ X
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic: E9 ?, X# Y V& A. s) O
h means it is designed5 a6 h- G2 G5 G1 d- E4 d+ I! T7 f
# N) [9 w. @5 }+ Z: R1 i0 r" N2 Kfor vector and matrix operations. You can often speed up your M-file c
" l) a: Z; i4 ~9 S/ l& u' v/ Fode by using! U) I, g+ Z( L" x
vectorizing algorithms that take advantage of this design. Vectorizati0 y* P2 q+ ~& U1 O" N! u
on means converting
6 s& \6 E. S$ P$ S# qfor and while loops to equivalent vector or matrix operations.”。改进
5 D. f h+ S) Z这样的状况有两种方法:
% F' D! T: b9 {& V/ K* e
4 a( P/ D, q( W( n( s4 s) Ba、尽量用向量化的运算来代替循环操作。如将下面的程序:
1 C8 H& w7 x$ I1 t- n' O5 O* K H& l7 v/ I
i=0;
1 j" ?$ x8 m3 f1 ~3 Vfor t = 0:.01:10
3 i5 e9 q& [ `9 I4 O+ U# l+ `2 Bi = i+1;2 \' ~3 f2 T `5 N5 r
y(i) = sin(t);
2 S& h3 T+ B* Yend. Q5 J3 C; K5 d2 @' q
替换为:8 [- c* o4 o0 K, Y
t = 0:.01:10;! b. l M6 l! e3 ~
y = sin(t);2 g5 B0 Y( n( a
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i- j& [; K8 C4 p: {. a( F) b
permute、permute、- H* [* L2 X, T& m! i
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
( T) Y8 n' ^) _& `+ Z2 mum、ind2sub、' s2 N" y4 Y: q% b1 z
ndgrid、repmat、sort、sum 等。
* q# T" K3 R9 Z9 y
! v. M+ X; Q' z请注意matlan文档中还有这样一句补充:“Before taking the time to; V) b; R' C! S2 E' s) _! O3 Y2 c
' _+ u% {- Z1 s& `, P
vectorize your code, read the section on Performance Acceleration.
5 W! o, h; o2 a, @& rYou may be able to# e' q/ S/ @1 C2 h, `9 r7 b
speed up your program by just as much using the MATLAB JIT Accelera* {! E8 n7 j+ b! c. V
tor instead of
! E% g* b. ~8 t0 ~* L: v' _ vvectorizing.”。何去何从,自己把握。( z& {% _) G- ?% o
( M" k/ U! d: S& g# k! t0 |b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执% O% p9 @$ }# v- Y3 S: z0 z
行循环次数少的,
5 c; S: q2 m8 o& ~0 H+ Z7 P+ L内环执行循环次数多的。这样可以显著提高速度。$ d3 |6 T/ w( ?0 ~3 {1 _
C/ J( n+ G( `, Q) y( O z' [6 R/ D2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on+ ?4 I J1 `7 L4 C
es、cell、struct、5 r$ R8 |5 L( w% Y2 x
repmat等。
3 z2 B; U, A1 m* Q) Sb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:9 |' @- x3 G( M5 { v) O/ z& I
: n) {* n5 C+ @/ \0 Q6 l+ S7 X0 l8 aA = int8(zeros(100));
3 ?. r( F! c p$ _换成:2 m( @2 ]* \; O& S5 @1 \# @
A = repmat(int8(0), 100, 100);
* x" \4 h) G/ ~' i5 t, g% y: Qc、当需要扩充一个变量的大小、维数时使用repmat函数。2 n: e" z- R. `
* l3 Q4 Y) b$ u* [1 E9 F3 U
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。! @- [" W( Y8 x4 ^
b、使用Functions而不是Scripts 。
1 _4 ^2 a. P2 U3 o) |
8 ]' ~% y$ H) y S1 s( \: [! ]三、 绝招
4 m* ^0 h) j# m" @
3 E/ F- F# N( Y1 x$ Q你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
$ x' k2 {" P. d1 g7 V: s1、改用更有效的算法: o/ i) a- X u1 o+ L6 T* @
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
% A4 o1 |6 R( I; y& O+ h5 L: A
5 f y$ X6 h$ P: J! H+ t关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++! H- P! ^- m1 ~% F. B3 z4 m4 }
语言文件,VC编译”。 |