|
非常实用的Matlab编程技巧。可以试一试。 ( b! H, O( n- O# G( h x) Q N0 a
CTerm下载文章: 紫丁香★
- A7 t7 r+ o0 _- v- E. n: C' f. B8 S Q5 ~
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
: n1 C9 R6 z: h$ u3 D标 题: 加速matlab运行的三重境界8 Y- `" U% J, J2 d
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)4 Q1 ?1 e. U. ^/ A3 |! t
+ M- K, g( j* C6 F) P2 O: \
加速matlab运行的三重境界
h, q/ t- r) K6 x) ~4 `/ y一、 遵守Performance Acceleration的规则
( |! _4 K) J0 T& D2 A二、 遵守三条规则
, O- R* F' \' ?, `$ _) A4 g三、 绝招
! f7 p$ y6 J+ p+ C7 a3 ]
一、 遵守Performance Acceleration的规则; H% `. A1 z! C& W9 ?
! K5 E$ b& u2 G! ]0 @
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
! C5 O. F$ Z& ^6 U+ j; \其规则总结如下7条:
& P% A7 z; I" A1、只有使用以下数据类型,matlab才会对其加速:8 ~& A) Q0 e, @; f( K
logical,char,int8,uint8,int16,uint16,int32,uint32,double
) Y, w0 b0 j6 [8 [/ v而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
1 `7 Z: }# h5 w3 i- t' B- pre,single,; @$ x1 i; \- R3 @
~5 W; o: f d2 wfunction handle,java classes,user classes,int64,uint64* n7 _2 C% x7 R7 o [2 N. c( l
2、matlab不会对超过三维的数组进行加速。2 c3 A9 |* w# ~# N. v/ C
3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
& {% {* r$ a% a- U# P来表示;" Z& W" X, J6 t0 G
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
0 E. I6 X' \8 \: Q; i4 m据类型,只使用
: v6 V& l$ p. Q& _9 ?三维以下的数组;c、循环内只调用了内建函数(build-in function)。1 @$ Y0 `8 z3 V/ v+ W4 C
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将) q8 ~" q/ M2 A, H5 R
加速运行。
5 s) H& L+ d! S7 R. n3 f5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
1 s' ^6 _& l/ ]- x( V# E+ Lx = a.name; for k=1:10000, sin(A(k)), end;, O' I3 _# o. M, W* q0 ^8 c9 N
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速$ E' \1 z8 s v( |5 D. w
度。! e$ {7 Y; L" u, V
7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低
. U4 b8 f/ Q+ D' ~+ F5 b运行速度。" |8 s: \! O( B7 s
, J. I2 ]' h" n6 {/ Y2 }
# r0 f; X/ e. }# y! y二、 遵守三条规则
8 I1 L" V, _% K
+ D, t4 A2 E: d' J9 P2 N1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic9 q+ S, \" ~. [; Q) C6 T" v) C4 s
h means it is designed! q' g) P. d- ^% ^+ Q
( k4 ~; u) M% U. @- Ffor vector and matrix operations. You can often speed up your M-file c6 o: a+ A1 o! G5 R% v3 v5 i
ode by using& G; O. B7 H: U6 q
vectorizing algorithms that take advantage of this design. Vectorizati
1 V& T3 O6 K& a8 L$ }# l# Eon means converting/ ?( C3 h+ G! v% j5 W& a6 z8 m
for and while loops to equivalent vector or matrix operations.”。改进6 K! C! z) |3 f# p/ |
这样的状况有两种方法:; _8 _" F/ e' F) ]: J
7 e4 e2 B0 X' h1 `: ua、尽量用向量化的运算来代替循环操作。如将下面的程序:- ^1 Q, u( v! |9 W% P
, D, L' y W' M: `" x+ Hi=0;2 h0 n% I- ?4 S( s
for t = 0:.01:10
7 q* k, X. ^6 g3 wi = i+1;
* ]. B; K$ J+ q& Ky(i) = sin(t);
3 N$ `9 H% i# g) q5 g; g$ Zend# z" D# c1 z7 _% u3 _$ B; u: ^
替换为:
# e+ }7 @9 t5 l7 {& ?2 It = 0:.01:10;2 U9 {4 U2 H" R7 f% |8 P
y = sin(t);
: X4 l. B$ ?! p/ x, K, B' n速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i0 H9 d& h( e9 V" K
permute、permute、+ W* l V; y$ w3 C" N
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums5 C8 B0 o" Q5 G& z
um、ind2sub、
. J3 ]/ d$ Z8 n# H( ]/ H( {& mndgrid、repmat、sort、sum 等。
, C! |( l# ]3 |+ v, o6 z& }7 G& f' S6 ^, _+ k2 J
请注意matlan文档中还有这样一句补充:“Before taking the time to, ?1 w# V! v; [& \% @! a
( \3 U; N0 s8 F1 _9 q0 ?$ evectorize your code, read the section on Performance Acceleration.. } B4 j8 C" v) j' t9 o* F; v& N
You may be able to) Z) A# N6 N G3 D
speed up your program by just as much using the MATLAB JIT Accelera7 n7 d# j7 T2 B
tor instead of
8 B' W% B5 |7 `: bvectorizing.”。何去何从,自己把握。
# J, {+ b5 B$ Y; ^& J' P p/ ?, J5 A: L( ?% S. a8 Y& }* A Q
b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执- W2 ^9 {' P* D
行循环次数少的,
5 ?. M; ?# x& @$ S内环执行循环次数多的。这样可以显著提高速度。
! h Y# I7 w! y; u+ l6 z, c0 ?! z0 N0 J- j' c$ W E! }8 |: }
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on
5 a5 j2 H2 C1 p; o( y/ Wes、cell、struct、
! I7 X) U3 n4 {6 g1 K+ q: lrepmat等。6 k& S1 a6 U2 p- M8 H
b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: e% U# e- t" u
, L! ]. b' d) p0 u' QA = int8(zeros(100));. S$ T- T; N, i& p
换成:2 h2 i8 x0 l$ T0 U
A = repmat(int8(0), 100, 100);# R9 N0 m' i& O- }! s( l+ P" h3 f
c、当需要扩充一个变量的大小、维数时使用repmat函数。
) }# J2 M8 n, Q3 F3 n/ i
& H) d5 I1 c) ]9 i4 Q% }+ B3 g$ k3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
3 y8 A/ }; X& P. n" P; n$ K7 h7 Cb、使用Functions而不是Scripts 。
# G' X9 R! D, [* W3 e2 E0 {7 d) G8 N5 }" ^9 B2 z+ W
3 k8 b" B2 m+ `2 Y三、 绝招1 v. Z9 M3 J5 s, [, k. |0 S. U* Q
Q: F7 C# T$ y% i0 E
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
2 y: j2 Z# C/ p( k8 Y1、改用更有效的算法
8 T# y9 E" }1 a& W C& _2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
3 h+ P2 d5 a9 @# f9 I# J/ U: Z4 Q
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++! c6 T+ G' J8 b
语言文件,VC编译”。 7 a8 U/ ^% F+ t( \+ ?/ h6 |
|