|
非常实用的Matlab编程技巧。可以试一试。
O" q- X6 x [( C* H4 w# Q& LCTerm下载文章: 紫丁香★
, s0 t) N, z$ p. U7 P5 ?8 e/ \* W# @9 e9 g+ I7 h* S* b$ H$ _' W
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab3 Y, C3 h' W6 }7 X$ h+ N% o/ p
标 题: 加速matlab运行的三重境界
3 G( |. `: R7 a& h6 L/ E0 W# i发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)& r5 s% u' r/ b0 Q4 H. H F
8 X3 J5 y6 H) `3 K8 F加速matlab运行的三重境界
% V+ H8 e4 V+ I) p/ j- O一、 遵守Performance Acceleration的规则, h; o# \2 R0 U4 M
二、 遵守三条规则- b; w% _0 N2 e" h
三、 绝招
$ b, I9 r5 m+ c- ~9 U. Z
一、 遵守Performance Acceleration的规则
# W2 i( C8 k2 o& j Z6 e' U
; S3 b9 l9 ~) q: T7 E! Z; W% _关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
% H1 w* l( W; w3 B0 }+ W; T! c其规则总结如下7条:; e$ |. E6 J( V7 ]
1、只有使用以下数据类型,matlab才会对其加速:
6 Y8 V7 C/ m9 s- nlogical,char,int8,uint8,int16,uint16,int32,uint32,double
" i0 ?+ K3 q& E: S% Y而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu0 J' ]9 A3 I0 i, p
re,single," F5 {; q! H. M
5 \# Z' a# Z( X; efunction handle,java classes,user classes,int64,uint64
4 v; G' C% A/ g* _0 b2、matlab不会对超过三维的数组进行加速。
3 H! V$ Z0 s* l; I! R L$ B3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值( n/ V( |6 S* N0 G+ V P
来表示;8 a, W/ E* q- K6 d9 D$ v% ?6 `
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数, n. g, } \4 m4 E$ k" X+ n
据类型,只使用; ?# c W' n0 {' S! j
三维以下的数组;c、循环内只调用了内建函数(build-in function)。& ^: M% ~7 f# B
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将) Y' g- L. }$ }- F C4 h% A
加速运行。
- z( E' y" E: K! h5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
; S5 V0 l) Z! j3 J; W* R- A$ bx = a.name; for k=1:10000, sin(A(k)), end;9 k1 V, w" x% J- w* w
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
& Y+ r( ^0 R T+ d( i, W7 a度。; v8 J8 u5 q) `6 W/ A- V5 z
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
1 N& T7 K' n. ^; ]+ s6 m8 }运行速度。
' z$ ^+ T. y) H, |6 Q. N% a$ U2 P& l% @; j! L
, l L7 T. b) U4 o& \! v0 K" {二、 遵守三条规则: i8 B( s& V% a- U ]& v( b8 ^2 v
0 b& d. W# ] c4 Q3 n @4 z2 d6 p1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic/ [6 e& _* c# ~* \" F) a
h means it is designed
+ g2 n: {$ R- J% j1 r. W! n. Y; [/ d' c9 Z
for vector and matrix operations. You can often speed up your M-file c
7 V$ o9 f5 u+ s( Code by using
% M s( L+ \/ Svectorizing algorithms that take advantage of this design. Vectorizati
% d, i5 z e# ]0 d9 v- i& V- mon means converting" Z% r- S' I- I
for and while loops to equivalent vector or matrix operations.”。改进
4 ]9 I" Z( F p1 Y* K这样的状况有两种方法:% a; ] [+ Q3 c* B7 @! f1 N3 K
/ b1 e+ P7 f8 J3 U: Q; g5 K0 s1 @a、尽量用向量化的运算来代替循环操作。如将下面的程序:4 o" |- i0 S% L q! X( `% L+ H
6 l3 z; e& v3 h! V( v8 W- y
i=0;) R3 i x6 E; Y( @- |
for t = 0:.01:10
. F B8 i% J9 ?! C+ I2 yi = i+1;: y* W* m# M8 p4 ^
y(i) = sin(t);- g1 s9 t# l% A7 m# x$ \
end `5 Y; ~) r% E5 c* {
替换为:
, f6 M/ `# b: z; }6 |! Yt = 0:.01:10;
0 z* q" a' _- S& m* {% my = sin(t);0 E1 Y* M# \1 z0 g( S
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i9 G) y, P0 _, z
permute、permute、* S$ t" a( D$ e
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums! l: T) L( A" P' M# J2 Q
um、ind2sub、' n( M z( C) O8 l1 W$ P( O+ R
ndgrid、repmat、sort、sum 等。
: m+ P' y [( r7 ~0 N" f/ ^. [) y; O- t6 j& `
请注意matlan文档中还有这样一句补充:“Before taking the time to
* b! w, A& m# S) n5 g- _# D& s2 @0 M+ `: ~- T$ r
vectorize your code, read the section on Performance Acceleration.; [! o( g$ E4 W& i
You may be able to
5 |2 `- i7 L0 B2 M g! l5 N/ Tspeed up your program by just as much using the MATLAB JIT Accelera
) [' m: G6 T3 r" T; ctor instead of! d9 x/ H+ H( Z. }# k$ \) E
vectorizing.”。何去何从,自己把握。) O; H, y# c$ F: }. J! H
* A8 X( I# o7 D6 W" g
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执3 Y+ t l) l% U5 B& Y
行循环次数少的,; W) x |3 e$ G6 `8 u6 ~
内环执行循环次数多的。这样可以显著提高速度。
& I( {, {: k! d1 p) V E" E' G6 m4 t2 B5 T4 r% F9 L- I
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
8 t& [' x8 k( p& ~% y Yes、cell、struct、
; n2 m0 {2 G) } orepmat等。2 i) e9 u& b% t' h8 D
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
/ P3 O. n) @6 L5 `, Y5 s- O% u& ?3 N8 n9 P
A = int8(zeros(100));
3 A6 e# q" I, y8 D, I k' E, ]换成:0 I n2 j% L4 X% c
A = repmat(int8(0), 100, 100); j; B: N) n9 q5 ?! B4 z% H; U
c、当需要扩充一个变量的大小、维数时使用repmat函数。6 m) K/ U! f5 p% u/ x9 G J1 H8 C
+ f- O) k" w; ?' D5 `3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。) G2 \$ @! F: e! R
b、使用Functions而不是Scripts 。- X! v P) R3 W
5 Z9 J8 U% Z1 t4 A+ v) T
1 [4 C% k r1 G; C; i% [/ ]: _
三、 绝招
+ r% S/ @. r( ^' [! _& t
1 h+ z' p7 }- P$ l你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
% Y3 J/ n! |5 r" b1 b( L1、改用更有效的算法/ X& U5 G D' Y4 W9 `! Q
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
5 f$ ]" \' n9 N( _: p
3 N/ C8 \1 a! t/ o关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
* x9 H& d, g9 v. A+ `语言文件,VC编译”。 ! R$ l0 ^- Q$ m2 |
|