|
非常实用的Matlab编程技巧。可以试一试。 9 U/ L. P% m1 W7 d. Y
CTerm下载文章: 紫丁香★
, a, _8 c. a6 ]) m: P, o3 ~
J/ x, s4 x: w, f$ m) D( g发信人: fork (撒哈拉沙漠的沙), 信区: Matlab4 r& _5 m3 L% m+ `3 f
标 题: 加速matlab运行的三重境界
" r: S4 q- p. F9 \- P% i发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
8 E2 I! r- V% L! u! E$ b; U- e |6 {0 o$ Q$ D
加速matlab运行的三重境界
% T( p0 L* H# R' P! ~; O一、 遵守Performance Acceleration的规则
" S, k# V. O5 `* n8 z. c$ k0 V二、 遵守三条规则4 q% W& Y( n9 m P: S4 S6 V
三、 绝招
6 p" @8 Y; L8 {& A1 {* ^
一、 遵守Performance Acceleration的规则
9 U0 H/ j% B- {! J m# l/ f/ u0 D
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
7 W \6 I: O" x/ K0 g7 Z其规则总结如下7条:# n9 C6 V: x6 Y) g3 k
1、只有使用以下数据类型,matlab才会对其加速:' P8 [+ T5 }, Z9 g
logical,char,int8,uint8,int16,uint16,int32,uint32,double
# @% G# `' [" B# u" q而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu- ~# c5 u, q0 [, {+ {0 i# \) h
re,single,
. ]! N$ P4 J o' u- x% w8 e. r1 x5 K' O" }8 p, X
function handle,java classes,user classes,int64,uint64
3 x3 ?9 p2 i5 v9 X& d2、matlab不会对超过三维的数组进行加速。5 q& L+ H* P) Q! U& K& Q. b4 }3 `
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值* l# Q0 }+ Q4 v2 f; D
来表示;
$ X& }7 w* Q" v2 p* mb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
9 P4 r! G# G: h( |据类型,只使用9 C6 @# f7 Y" p% o" @! }
三维以下的数组;c、循环内只调用了内建函数(build-in function)。: X2 o5 s a: g2 i8 ~% q
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将8 C0 a9 O/ w5 }) g
加速运行。
% _3 p/ i. n$ }) p( @5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
: R# F) P( [( c0 O" M, Bx = a.name; for k=1:10000, sin(A(k)), end;- J+ p9 b4 y; J2 n" q2 X
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
`9 @/ O/ E/ @4 |% Z1 Y& G7 Y+ E度。0 {3 |; g. n! F, |5 e
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低3 l# Y; [6 Q" V3 H4 c, d
运行速度。2 L$ a0 J5 S' h
! J0 K7 M% j2 G; `6 g6 e
0 g# H* w6 P5 D v) g# E/ N二、 遵守三条规则
% v# b, `# z: i. @! J
' A. \0 F7 E! S. k* x* Y1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic8 D: H1 i% | Q( A
h means it is designed
- z. s" v2 {- R' | W
# C$ v6 \0 i" k( I* `" C2 O' l# mfor vector and matrix operations. You can often speed up your M-file c
9 d- T+ x. L& I7 O# l! V6 c- L' o7 a7 Kode by using
1 h' k. Y; S& H' W& kvectorizing algorithms that take advantage of this design. Vectorizati* P- d3 c4 x' `- b- i$ F4 K: X m
on means converting" G. I; Q5 Z2 `: C8 L
for and while loops to equivalent vector or matrix operations.”。改进/ y; l3 ^; ]0 n6 {* x8 U7 Q
这样的状况有两种方法:
: L0 r5 G; U% _) n" A6 ?" j$ U6 f2 @' _* t9 b
a、尽量用向量化的运算来代替循环操作。如将下面的程序:
+ M( e" Y! ~' k5 K7 z8 Q% r& k c4 L2 m* T$ I& ^/ `/ ]" d
i=0;6 E1 K9 A0 [5 q* T( k
for t = 0:.01:10
5 I* l5 M1 n% v! d4 Si = i+1; f+ k6 G/ [( p3 O/ ^/ h2 x" R
y(i) = sin(t);
. O0 r! V& W6 tend
6 \, _! E) R/ I+ M" E4 {; }8 L O6 I替换为:
0 K& E6 c; h. W) G! ^$ P B1 Lt = 0:.01:10;
! e1 D: F" M' T: h6 H9 ~y = sin(t);
6 V* o% U/ O- e- S# G! c速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i3 J0 u9 U" _- o/ b3 v _
permute、permute、
+ @+ _: t* W/ M) ~& ^6 Breshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums: a: H/ M5 ]2 n1 H
um、ind2sub、4 @7 |- ~9 p0 n& m/ ~7 Y( A' l
ndgrid、repmat、sort、sum 等。9 M) H4 ~5 I7 }8 n* i
3 v, u* c+ M1 S; k1 |
请注意matlan文档中还有这样一句补充:“Before taking the time to) Q7 b5 `/ O6 G: m, x
( a) a" P. ]8 v/ Y$ Z% M7 uvectorize your code, read the section on Performance Acceleration.2 t8 Q; M9 f4 j9 M- w, ~
You may be able to. U7 O& F, t& `* L
speed up your program by just as much using the MATLAB JIT Accelera
! H3 ^& R4 \, H' Q% m: x- H; @tor instead of
* _6 S( F' L# a( f4 tvectorizing.”。何去何从,自己把握。6 l6 M; M1 R( Q; B2 U( V/ E. K' }/ b
1 x9 Y+ u* E9 b- T7 p9 B9 Qb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执' U( L% ^( L! n ?
行循环次数少的,
0 M9 E1 L0 h: C9 \5 @内环执行循环次数多的。这样可以显著提高速度。1 n) h% G& z8 N h' U3 i" \
* d: r3 g7 g' v0 K2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
4 f# z7 w$ L! l) Ges、cell、struct、9 q5 q5 t& `% Q
repmat等。
/ M" Q# W* ~3 Y' n% \( l& pb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
& K- H/ S6 J! E7 Q4 r& [( s# ?" P* w& ^1 P4 [( O
A = int8(zeros(100));6 [0 a4 N* Q* T# u, \/ T f
换成:5 M7 J, R5 c" c5 R+ s$ M/ b
A = repmat(int8(0), 100, 100);0 {$ j8 L- h# x; D; Y
c、当需要扩充一个变量的大小、维数时使用repmat函数。% Q- `9 @ @7 l# a& Q
3 Y6 X2 l2 C4 z3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
# G Z" s8 L7 P5 L& Yb、使用Functions而不是Scripts 。1 b* |( H3 I$ h8 H) H# G- j
2 }9 T) X3 C9 ~5 s! K( {
h/ {7 h- a% p' e, S H三、 绝招0 e6 J: K1 ^' H/ Q' Z! I5 ^
: R/ ] R& P! a5 Q! U* p4 t你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。: q* O) [/ c$ \( n% i& k
1、改用更有效的算法! A, Z; P4 D+ w) k6 {4 E6 E
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
; A$ s/ j6 v: f
# z3 @2 c( D3 f( Y# I/ Y+ X关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
* M2 E1 X: l" j* A语言文件,VC编译”。 ' x, L& N3 [# U# I4 Y
|