|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
! c7 E- q8 T- @, s5 c t标 题: 加速matlab运行的三重境界 l* a% g) \9 F0 Z' t
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
( g: M# b6 a; K0 `: k& P
, g t5 A' I2 b6 C6 _加速matlab运行的三重境界
* ]/ `7 n& h9 b2 X/ p% j5 D- q# ]4 u- Y( v
一、 遵守Performance Acceleration的规则
( Y7 b- F( r% x) }( F4 k+ i! ^9 b! u- m; n; [4 e
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
4 v3 x) z; G3 L% C' d; w其规则总结如下7条:; D. Z- r! m4 O
1、只有使用以下数据类型,matlab才会对其加速:; ~5 {2 A, |0 A1 N$ C
logical,char,int8,uint8,int16,uint16,int32,uint32,double
7 }+ r, g7 C: s3 h+ q: _而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
) p% A) g0 O. Z4 b. x5 F" T5 Are,single,
6 D$ r$ R2 z9 p" i0 O" d; R, ~) s$ D P8 ~0 F
function handle,java classes,user classes,int64,uint64 ]$ D( P* Y+ i. v# i( |5 m
2、matlab不会对超过三维的数组进行加速。" _* L6 D$ D, `
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值. q# u0 j% a- D/ V7 ]6 q9 \
来表示;
: ?" p, c# A2 c$ h2 g9 G- {* Z0 [b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数& V& M- {$ Y+ E0 x
据类型,只使用
! J" [# g+ M9 [: c' V/ K三维以下的数组;c、循环内只调用了内建函数(build-in function)。
* g ~( o( J8 B, C6 _6 o4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
4 I w* ~; h& l S8 J' @3 k; o$ K加速运行。
; G5 f5 J: N; E% y* @5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
- o6 S' }' `' L1 ^! e# v! `x = a.name; for k=1:10000, sin(A(k)), end;! L8 `: A( r$ ^$ u, K9 \& f) a" S
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速# @; y M0 P. J6 `5 k# R* E
度。
R- q% v* @$ Z4 @7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低$ e) G$ f/ a$ R2 K% V/ |
运行速度。
7 b8 b& J, L1 H( a; c( k# `' ^ 5 t( i6 ?( \; M8 M! z+ k9 b; K
二、 遵守三条规则
$ B6 s* J. p0 `/ v, I* |+ {- v E# W* M1 J
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
8 o: M+ r9 U! ^) y0 I7 }* c, ?( @h means it is designed7 e3 p" W0 u# ^# T4 {
& u; ]. h$ r+ a; E# D1 Wfor vector and matrix operations. You can often speed up your M-file c+ X9 L6 x% h( X
ode by using
7 U, b+ C q1 f, _; J. j gvectorizing algorithms that take advantage of this design. Vectorizati
2 u5 v& N/ }! v. K% T) \: s- eon means converting8 L. L6 S2 U" t7 c: r5 c
for and while loops to equivalent vector or matrix operations.”。改进8 H7 f8 X/ l. b( C$ b
这样的状况有两种方法:8 I5 y- X; @& p* m5 R% b
- K: X1 {& F8 G: }' ia、尽量用向量化的运算来代替循环操作。如将下面的程序:
9 J8 o8 X" q0 C7 B
( B! z1 K& d3 W2 z( fi=0;7 j+ c% F1 `- }* i
for t = 0:.01:10
5 I; ?$ G8 m6 k; ~8 A1 Gi = i+1;
! M) B' N& \. [, y% ]y(i) = sin(t);7 |* V( f- {" C3 f% q+ R" I
end
& U1 o$ }4 C/ U替换为:
7 H/ N6 A5 M7 b- }1 z# |# f; Zt = 0:.01:10;
! f$ H5 a( A' S% o) ny = sin(t);
9 c3 ]( H4 o; X速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i2 U! L! s6 ]' U- \
permute、permute、1 Q6 L$ T) H& n
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
$ C+ I$ i& B& c0 Bum、ind2sub、( l/ u( M) k) b+ i4 C; |7 f
ndgrid、repmat、sort、sum 等。! \7 l ], Z4 A8 n
4 R5 C- R/ |, H. z+ ]. R/ ?, X% r请注意matlan文档中还有这样一句补充:“Before taking the time to
+ _. E0 g3 c% n1 o$ ?' W
w$ Y6 v) S2 @ M; H2 _9 C: fvectorize your code, read the section on Performance Acceleration.. L* h* f, f; g& r& t. a
You may be able to7 j) b- ?3 {. O$ v: P: \" Y8 [
speed up your program by just as much using the MATLAB JIT Accelera3 Q8 M1 ?# L8 x6 Z/ Y
tor instead of' x3 x1 W: b5 K2 ]& [4 @+ R
vectorizing.”。何去何从,自己把握。
4 l+ ^& P. }0 T( v9 y& R2 i( Y; |" S
$ G4 q6 w" v2 g2 |$ qb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
4 D/ y3 R- J( H5 B行循环次数少的,
* _ ~+ V/ `8 g; Y内环执行循环次数多的。这样可以显著提高速度。
. @# f: ~' K! ^0 r9 G' M- [# o
' B1 D8 }- \& u+ c5 R( I2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on% E' z C9 k+ j- c+ ]. M/ ?
es、cell、struct、
" w1 ~7 a' {( H2 Srepmat等。" [% Y0 q( T" ]& X
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
+ H# ~/ M1 G8 N
+ R r6 I2 E K7 v) ZA = int8(zeros(100));
& `' ~$ \) L, O' l# y4 F换成:
' ~, a# ^ x7 Q* u" V0 ?A = repmat(int8(0), 100, 100);* a4 x$ y. l9 V( Z" K
c、当需要扩充一个变量的大小、维数时使用repmat函数。
$ _3 i% q& c( _- ?8 Z2 a9 {) Q% N0 y+ H
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
% `8 j& }; z8 O: Zb、使用Functions而不是Scripts 。
8 l/ A- K- c/ u. S3 |, E {2 n ) a9 [0 N+ P$ {1 G8 |2 p9 {
三、 绝招- W. y& P* q3 m) \
% m# N! ~( t! O, Y- B* ~你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。& C+ h6 }% T, I X4 N
1、改用更有效的算法+ `8 q0 Q0 D6 k) k
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
% d4 r% C9 X# z8 T( X* H' G5 {
* c- q& p! N5 w3 Z7 r关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
2 x# \* \( Z9 p* j语言文件,VC编译”。 |