|
非常实用的Matlab编程技巧。可以试一试。
+ \1 z$ z7 X. y" d1 i: A/ V- BCTerm下载文章: 紫丁香★6 L; o0 _& n- A$ b' L
6 C; {) M$ b$ @. h& B发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
, l1 v' d& p: U# [. J3 P标 题: 加速matlab运行的三重境界
' ^0 m! P* v& a( x- m发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)
5 s6 l; W- n n/ {% u9 f- |1 p
( G8 p0 h2 v1 S加速matlab运行的三重境界
; d) y, b8 @3 E9 p% \" R7 N7 `, Q一、 遵守Performance Acceleration的规则& }/ T$ r$ J1 j7 g I
二、 遵守三条规则$ i5 N4 `2 @+ Y9 F) z+ P
三、 绝招
" d% U: ?9 Z. L% H5 e' V一、 遵守Performance Acceleration的规则
% l n3 z8 x6 i0 f ^" O% ? {
# C. |6 W( E F8 \7 p4 o& s) a关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
9 Q6 B/ Y# M: P7 O( C其规则总结如下7条:
- h+ M; g; n2 ~+ d9 {, F$ t1、只有使用以下数据类型,matlab才会对其加速:9 M' T; | k/ C2 C* z* }0 T P
logical,char,int8,uint8,int16,uint16,int32,uint32,double- N& @9 A! v+ l* ]
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu8 A! q6 w- n u. x
re,single,
7 c# Y, A) Q( G4 T
0 I* `) b- ~2 nfunction handle,java classes,user classes,int64,uint64
- q3 |) ?' P- O6 J2、matlab不会对超过三维的数组进行加速。
% f& d& b7 y7 E; o7 }1 b3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
, l! y# A. g. d8 |# a8 d) r来表示;% c1 p- L. m) y M1 J( _7 ~
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数: g d. |7 W9 A) B3 C; u5 c
据类型,只使用( U7 Q# K6 w H o/ h
三维以下的数组;c、循环内只调用了内建函数(build-in function)。
7 g7 H1 I* }2 ?2 o4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将7 C& U L6 |/ t) V3 K
加速运行。
- a, {+ C. _0 W5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
$ T* a! z3 b1 j' _+ ox = a.name; for k=1:10000, sin(A(k)), end;" {( @; Y- W8 T" U
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速; f% l/ t9 X, D0 y' z
度。) s1 U$ Y! L9 i0 R: m! m2 G% G
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低# F8 {( ^ ?, e
运行速度。5 Y. H. g q5 t/ E# _# } P! g) b
7 U. k- K9 q* B4 S, c5 R T, v% I9 _
二、 遵守三条规则
7 |0 n( z$ z$ R
k. K' T7 @+ ]1 H; Q6 D* Z1 C* H% K1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic0 E \* B+ c9 A) K: j' y. T
h means it is designed4 ^0 l7 B" {. J- }3 G9 m* Z
9 s4 X1 O2 e& ~" o9 V6 Xfor vector and matrix operations. You can often speed up your M-file c
- @! w& |' x" ?9 t8 t4 A1 K! j, |- Node by using
) A- ], q! Y2 ], o* m0 ]. h" svectorizing algorithms that take advantage of this design. Vectorizati( [1 J- p4 n+ \) @3 o, }
on means converting
1 O. n# d4 {9 Y, v6 F* l# cfor and while loops to equivalent vector or matrix operations.”。改进
- [+ g5 [; x: @! ^" G! N" ~这样的状况有两种方法:
9 O: g m, ]% ~1 |" n6 U3 ?0 D! b
a、尽量用向量化的运算来代替循环操作。如将下面的程序:# \& I T+ O: u! P$ r0 ~
9 S/ b4 [( S( F) Z8 c9 Q) c% P3 H
i=0;6 D1 S& b/ ^4 o% ]1 q( L
for t = 0:.01:10" w P' p2 j1 B/ O0 m
i = i+1;
1 t% S4 i$ d V* y: n( gy(i) = sin(t);3 p- A5 `- c) b+ k. h
end
3 M( X$ F) \. r+ ? T/ y" ?替换为:
, b. u" d, d+ e. g9 |t = 0:.01:10;4 P8 _/ ?6 T2 Z H! \
y = sin(t);/ I, _: W3 S4 N, L) [
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i% c; C7 Y6 U1 ?+ {7 X0 ]
permute、permute、
* S' N% X. ]# |$ P" }- x# areshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
k# ^% \4 K2 N9 Q6 v5 ?um、ind2sub、 L+ k9 @" I- L) W3 h
ndgrid、repmat、sort、sum 等。
7 {! A( Y! @' ], E! K1 s& o8 S+ q+ Z ~9 ]
请注意matlan文档中还有这样一句补充:“Before taking the time to5 Z/ |, L$ G" |& T. w. T$ l
1 A3 B3 S9 _" O
vectorize your code, read the section on Performance Acceleration.
7 Y0 j* ~5 u( s" I: WYou may be able to$ z2 p( o2 ~ {) Z1 i
speed up your program by just as much using the MATLAB JIT Accelera
A5 D. y, ^8 e3 `; Q2 qtor instead of1 m- R, R( T& s/ x; a/ _. Q/ A
vectorizing.”。何去何从,自己把握。- u* H9 J* }* h. K
$ |1 Y8 C! I' O# c+ v, E. z
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执- C% ^2 ^6 e9 R9 j5 ~4 I8 f
行循环次数少的,
, L) o7 n. l' W: y5 U3 {0 g内环执行循环次数多的。这样可以显著提高速度。
4 i" `* w9 ]' Q3 @3 c+ i* K& |* S1 \- [
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on8 Z+ Z, w; O# a4 u2 W' ?! h: K( D
es、cell、struct、5 u" o8 N$ K: U: a& o& P! p4 Z
repmat等。
6 J% l" B! a y1 Xb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:& k+ t. s9 K" W+ H8 s; m: K" @
' H/ l2 q- T7 o
A = int8(zeros(100));
5 v- x+ [3 W' c, O换成:/ U7 l% S8 n. `* x; H
A = repmat(int8(0), 100, 100);9 G: Q! S1 k+ f
c、当需要扩充一个变量的大小、维数时使用repmat函数。2 d% z6 N: B( \& l: |7 L0 I
$ I, Y$ j s- @/ Y
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
( a3 _3 C" q; X9 Wb、使用Functions而不是Scripts 。
, p C i7 P( b2 Z7 s; c$ u4 a$ Q; f& ]; }
$ `2 ^/ R. y1 U8 J* H9 |三、 绝招
q9 A" C4 Y4 k
# l' |; @3 D0 i& r' [5 A0 U你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。! ~5 S. l! O8 R) H8 R0 A
1、改用更有效的算法
: b! [1 O8 i) K3 m/ I1 w2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。: A% ^* f, ?4 \6 K
4 B7 u, Y- w% X8 S) \8 R关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
4 ^ v; A0 |; z! ]; Z) H语言文件,VC编译”。
- X1 d" A$ A8 V Z' [ |