|
非常实用的Matlab编程技巧。可以试一试。 . ]; w; m- }7 O; B& h
CTerm下载文章: 紫丁香★
9 h1 s: p5 s9 S" u# C+ j/ {+ l# C! L1 Q9 }
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
0 X6 `4 s+ p- P. t# u$ V) l) Y) z标 题: 加速matlab运行的三重境界
* q i8 n* M! u: p) y发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
$ l: ]3 M4 w5 K2 \0 C! V
# ~6 N! k! V5 C, t; v6 h7 k" q: C加速matlab运行的三重境界
8 C& V5 E9 K9 ^' |5 h' ~一、 遵守Performance Acceleration的规则. y6 Q7 b0 |, x2 S" v
二、 遵守三条规则 E! A E1 Y* T& w% _8 k, y$ L
三、 绝招
! G+ ?$ s- P1 r+ y0 g. P4 d
一、 遵守Performance Acceleration的规则
1 R* Z8 i: Q% y+ w( i* k: h0 |1 Z( o& x; l! e* Z
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
* Y$ ]7 m# e4 K( a其规则总结如下7条:
}" D$ u- h- r+ y6 L( D1、只有使用以下数据类型,matlab才会对其加速:4 r. q5 p5 b% r# G' A: m
logical,char,int8,uint8,int16,uint16,int32,uint32,double
^( C }/ Z& V) U, ^8 u而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu5 {# d' {: F' W
re,single,) E0 m* }2 p V7 ]
6 `' s! Y0 ]+ |6 u. @ J+ hfunction handle,java classes,user classes,int64,uint64
8 C, M6 Q% e& z$ ?. q- H& T2、matlab不会对超过三维的数组进行加速。
1 n3 l; ]+ z+ n8 C* O3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
6 L. O. C0 {% N* b9 y* K6 M+ N7 r" j* N来表示;. ^$ D, w2 \7 k
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数5 g! D) I& j3 N& P/ ]; K
据类型,只使用
: R/ J) W( r6 P* q三维以下的数组;c、循环内只调用了内建函数(build-in function)。' c$ _) G( [ `( I3 G* g
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将6 D7 m6 w8 E0 c" Q9 {
加速运行。+ i" p+ V8 w6 D0 D) [7 J
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
) W" x7 E) \/ ]( I0 h. N7 dx = a.name; for k=1:10000, sin(A(k)), end;
" [0 G1 u( y$ q: o% U6 T! M- q6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速. Z( f# R/ l4 p* L
度。
) P) W, T0 t5 o8 _) i8 Z+ _7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低3 S8 [( k/ n9 O# R: ?4 z( \
运行速度。" J/ M. Z' B+ N8 [. t2 u" J
6 O6 b. ^) ~2 m" t! I1 V9 s7 T: L& P3 o" c. s# H9 ?
二、 遵守三条规则 R* ? ~* ?) ?+ j5 _( u- ~& l
: m0 r. \. k4 u0 s) C
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
1 I X+ w% j3 }2 I M' Vh means it is designed
% c" ^. M' l4 R R3 N8 z. E' C! H4 J9 A
for vector and matrix operations. You can often speed up your M-file c. V# d5 T) a+ i* M
ode by using0 B. }6 j @" k; _* i
vectorizing algorithms that take advantage of this design. Vectorizati+ T$ l! O- L0 n
on means converting8 t9 u3 }7 u M3 J- D
for and while loops to equivalent vector or matrix operations.”。改进. i6 t/ w: M6 K) I
这样的状况有两种方法:
. f; v4 q" P1 e) D; g
, h l" |9 B( Ea、尽量用向量化的运算来代替循环操作。如将下面的程序:2 ^, M% ] V, z1 h
7 M# z* ?2 {9 ]! T$ b
i=0;- g- s& Y9 r: Z/ G: H2 k$ Q
for t = 0:.01:10
3 a9 ~5 C3 `8 Y+ ~: D1 p( P* ^i = i+1;8 Y3 U$ I. i# D: J
y(i) = sin(t);
6 D t* }0 ~& E$ y3 \: ]1 Kend0 C( {0 Z; n. g y4 }1 d
替换为:
. B! V# B6 _7 v+ q0 b" e4 nt = 0:.01:10;
& h! T' l( W4 }y = sin(t);# x% ~' ?4 F7 G1 m U4 a. {
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i2 r+ H6 b5 ?7 O4 N
permute、permute、
: D d: h% T8 ]" r# |, vreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums# w" D* U( F* @/ C, f$ k
um、ind2sub、
% Y- d G) n' {5 _; B3 }ndgrid、repmat、sort、sum 等。
2 H$ F" Z e% F7 O' V* @0 K( e. ^5 y- W! u
请注意matlan文档中还有这样一句补充:“Before taking the time to; g2 {- G# I" v" S' Y* ^* D
, G- H/ F/ j' \+ P5 z' U
vectorize your code, read the section on Performance Acceleration.
; l3 C. e% w' W) i& ^3 wYou may be able to
5 m: ^8 l7 N% f5 lspeed up your program by just as much using the MATLAB JIT Accelera
5 U0 Y7 ] s" m" R6 S. u! b+ U0 |tor instead of- D6 f# e0 G) J8 u/ p5 i. y
vectorizing.”。何去何从,自己把握。
& c/ U2 n- o% O) T1 A6 e; M% j, V/ F6 @& ^ i$ u
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执4 z; Z9 M, G3 I) s
行循环次数少的,: z! b* l8 V2 ^' l1 N
内环执行循环次数多的。这样可以显著提高速度。
- d, a8 j# w% t& x$ U
+ _/ k! w. u. E, `0 `& g$ n2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
2 h( b" y) t1 n3 O. d1 A0 ces、cell、struct、
7 x7 \! F0 Z$ Qrepmat等。/ q) ~% m! c" Y- t% [0 l
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:- f+ p" R. o/ A8 o' s9 k; z2 j* f
6 k/ l$ _# g, ~5 c
A = int8(zeros(100));
, c8 ]1 X Q/ `换成:
$ P/ Z& x4 O7 s- ]0 RA = repmat(int8(0), 100, 100);
% M; R$ ~! X/ k, c* |c、当需要扩充一个变量的大小、维数时使用repmat函数。. A3 ~9 D- n* O
) V; c0 X8 g. M7 H3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。- H X, H4 |& T- H- s; P8 j
b、使用Functions而不是Scripts 。+ Q R4 F, z- u& s& ]) Z( m
! h5 B. ~5 t' e: G" T
0 Z4 P9 o1 Y0 k. L
三、 绝招7 G9 o& g% D1 W1 v% I% o! F
3 s# i+ o* e# g% g! {* u) P你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
5 X; r4 R# Z6 O2 d) k1、改用更有效的算法
2 m+ C5 @4 M0 d6 u2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。9 C* B7 w3 C, r% M: W; |. N
" P3 V% g& W+ _( ~
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
p2 }3 p$ I( q" \. V7 X _语言文件,VC编译”。
+ y7 b+ K0 u5 R: j |