|
非常实用的Matlab编程技巧。可以试一试。 4 J& l, K; Z3 s9 R2 Z
CTerm下载文章: 紫丁香★
r5 y5 q* [$ M5 O1 i" T2 D* [8 @' K$ I7 S
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab4 ]: v3 z' l* Z" x4 {6 T3 c
标 题: 加速matlab运行的三重境界6 a/ h S9 F; A1 B+ w
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)2 n7 E4 _+ r- U1 U5 Y# z& j
8 d- M- G# X# w# P5 p: I加速matlab运行的三重境界2 O9 }. r0 ~" U+ \1 I9 u7 F% X
一、 遵守Performance Acceleration的规则
6 r' j6 i3 o" s) T二、 遵守三条规则& G) @( x. ~6 I' d2 {- a3 S
三、 绝招
1 d3 C& \9 t6 S' @
一、 遵守Performance Acceleration的规则* |8 g% y) K) ^5 m" G
: v# V* }) n2 ~/ \2 R3 H: V关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
" F) {# K" m* M% `! ?2 L5 z9 i3 i其规则总结如下7条:9 k5 u3 D2 d* B F
1、只有使用以下数据类型,matlab才会对其加速:& Q0 G4 D+ k3 F7 q
logical,char,int8,uint8,int16,uint16,int32,uint32,double4 }1 \; ?' d+ @, f+ r
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
$ u8 f5 T2 p1 f. p; Cre,single,& w5 m/ `; Q: W8 t7 X
% A# v! R# W. p
function handle,java classes,user classes,int64,uint64- y5 j/ w. A6 r+ I; y; f" f
2、matlab不会对超过三维的数组进行加速。- R. x9 i# q$ Y$ |
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值2 p2 D) U. e1 A v; h% ^
来表示;
( m2 x: |/ f+ U3 eb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数& x, G ^4 ]$ \# _& D5 g
据类型,只使用
f5 h% c8 I, Z" [& Q( W% v$ b三维以下的数组;c、循环内只调用了内建函数(build-in function)。4 u% R* C/ z1 `6 J3 E
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将. y, e. ^+ N4 g8 M* h
加速运行。
( f5 ^9 w6 v" v& D& C8 h i5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:& F1 h6 K f/ ]( z$ x" x
x = a.name; for k=1:10000, sin(A(k)), end;
* A5 |- `' t5 K; g6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速# X$ Z+ W' c- }. H' A3 k
度。/ u6 x* x+ l$ ?: v4 F, f
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
2 L0 W- T& ]! \# Z0 I7 i运行速度。
( h) | s: O8 Y8 c/ Y! g6 f) u6 b; w8 ?
6 ^- Z5 X- y! u% z2 u9 a, m
二、 遵守三条规则
, Z4 \$ f Y* P* v7 t: C
+ B% e; E p; J" w1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic
v7 u& D% S4 x3 d0 y8 rh means it is designed
$ k7 P) [" q; Y. E9 O7 C2 g2 m/ u) Q$ A5 |4 w e
for vector and matrix operations. You can often speed up your M-file c- z8 K; a0 t- R8 {
ode by using
6 g" W+ q, t: X, q8 u ]vectorizing algorithms that take advantage of this design. Vectorizati3 V1 {5 ]+ |5 F( G9 A6 G- J
on means converting9 J0 u2 B: P. W
for and while loops to equivalent vector or matrix operations.”。改进
! v3 e w; R" w7 x这样的状况有两种方法:- I! F8 V M0 o- s2 U! R
$ ]2 v# ]( I' g9 D/ [2 v
a、尽量用向量化的运算来代替循环操作。如将下面的程序:! e5 s( |* R! v6 g( C: W
% h+ u R8 Q4 r* X/ l5 Yi=0;" F3 b. h5 F9 `6 b& N- E( a
for t = 0:.01:10' i+ w( ^) @* n2 @
i = i+1;
2 ?* {" u* D& C7 K8 H yy(i) = sin(t);
/ t- |2 c; n! M$ i9 h4 dend
& N2 q \9 L+ d$ F. Z: I9 H9 r% Y替换为:
! g9 p; G: |7 u, E% g) F& _; {% Q4 mt = 0:.01:10;; i# }# Q0 O+ q- @+ s S
y = sin(t);
& z. g P/ ~) m/ t1 e速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
2 I* E6 d$ ~% r4 w8 A4 mpermute、permute、
6 f# @$ J B u+ [( z: Oreshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
* g2 V" D2 A. O; D8 D5 U- _um、ind2sub、
# y7 X! t% O d' B* O. m7 d, ^ndgrid、repmat、sort、sum 等。
$ w5 F' b$ E1 j
1 W! k T% H; t( ^4 b请注意matlan文档中还有这样一句补充:“Before taking the time to
( {+ J3 _( x' W5 A; V# J. X
& q8 T5 |, ^/ A9 _# [- W) zvectorize your code, read the section on Performance Acceleration.
! r: j: E+ p7 U" @- _You may be able to, U8 E0 M8 ~- r8 x6 W* h* u
speed up your program by just as much using the MATLAB JIT Accelera. q5 V8 y# {" T) R& M. O- R
tor instead of7 D+ O- k4 T0 V# E L
vectorizing.”。何去何从,自己把握。
% F! D$ {# ?3 c8 M. o8 ] z# J$ H. a7 e9 a' E
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
3 e8 u# H! [5 c3 V: Z行循环次数少的,2 t4 @1 a) c0 q8 ?! ^
内环执行循环次数多的。这样可以显著提高速度。$ I$ J5 c6 u/ i# F3 n0 H! k
. z9 q7 }4 Q1 b3 ]) p" ?/ H2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
b& U+ g" P* {# ]3 H) @" \8 Xes、cell、struct、
( f- K9 l& w: G% l; X a7 }8 O9 [repmat等。
' v, l$ M- W4 Q3 p1 gb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:9 R' V9 Y3 L/ |4 ?! k. y$ q: Z$ G& }! b
$ ^' d- T0 A) w" d7 O, P1 K7 LA = int8(zeros(100));! ^" b4 t" p- r
换成:) X' {9 I: K% @
A = repmat(int8(0), 100, 100);" R. i' [/ ~1 w
c、当需要扩充一个变量的大小、维数时使用repmat函数。
. ~% a0 @ a6 ~ i7 W
4 f; M: j' c/ w) ?* }* X3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
$ \3 J Q' p+ e1 D: u; ?b、使用Functions而不是Scripts 。
; D6 L/ j+ p9 C2 x* e" w9 Z0 ~
B* I: Z# r" s% e; @7 ]$ r. o" C% h* w( K+ N
三、 绝招0 c% n2 {1 _1 c
6 m/ L0 l! V$ n4 u! b( O2 @2 V9 S你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。! Q2 F4 W1 C! S+ W( d$ s4 @* X
1、改用更有效的算法
$ k+ _/ M; R: F4 c2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
]; X) o* v$ c: Y/ h0 h7 M0 x6 v/ M' y
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++6 p$ D. p1 q& l0 f* i
语言文件,VC编译”。
! d9 K% Z5 ~# p) z7 G5 K |