|
发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
: ^8 a( w5 l& p2 e- [8 r+ Y标 题: 加速matlab运行的三重境界! }, b6 J4 R Y6 f
发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)7 u7 \; m ~* t+ W( o4 }. {
* J* E M5 Z8 r+ |0 H加速matlab运行的三重境界 * m; D/ t8 t& E( D1 n
; m# j. M D' M+ V" ]4 ?7 W
一、 遵守Performance Acceleration的规则( @9 |7 N: |# V0 ?6 e6 Y% x+ i
3 b- m$ G) u$ `, U1 y% o! G3 C
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将
( ~: v- X% D% S4 W" U1 x) F其规则总结如下7条:
. K! _/ H1 N6 F" q) U1、只有使用以下数据类型,matlab才会对其加速:) W) Y; |' e* m5 x1 n+ R2 O t; D' L6 L
logical,char,int8,uint8,int16,uint16,int32,uint32,double% u5 Y, A' K& j2 ^% B' a
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu
( m7 X, y. ^! ?9 r% N$ dre,single,* B- P) I3 J; l# P! T
% L* K1 c1 k$ \, D/ Cfunction handle,java classes,user classes,int64,uint64% O' x5 @1 u# e# l( x
2、matlab不会对超过三维的数组进行加速。
$ G8 `( \6 q i6 S1 Y3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
+ R% X1 \8 ?4 ] n" k# g0 v来表示;5 X5 p9 z- `( N0 F
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数
$ J& n' F2 v% j( @0 Y8 L9 @7 B据类型,只使用% P1 n0 ~3 u" s9 G
三维以下的数组;c、循环内只调用了内建函数(build-in function)。( l! p8 r, L! @) @
4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将. Y( e/ z2 t% G: D6 b2 m& j
加速运行。
! q; _4 u6 s( O* Y% k5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
0 G }2 M% m5 l ~3 G! w% b5 Zx = a.name; for k=1:10000, sin(A(k)), end;; [1 Z. h% B. B( \2 E; |5 T( P6 N
6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 `+ A1 K! n# V
度。
; c! ~4 R/ W1 y* l( ]5 m, J% e# A7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低7 v. E2 U2 {3 M3 Z# W! d! N
运行速度。
5 J3 |, z, y( u* ]
- F8 _6 u0 i9 [. p6 ^二、 遵守三条规则
8 ?/ g( I4 j4 B( C3 Q# s. S
( O8 `2 t- N; _& W ^1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic q: n3 B/ N. g! w
h means it is designed
# S5 m0 p% Z/ j" D/ W5 ^7 u# _6 Y5 j/ G4 S5 F, U: z
for vector and matrix operations. You can often speed up your M-file c
6 h" C8 Y' U. m8 o; {7 g3 Sode by using: R$ d) }9 i$ h7 P+ p
vectorizing algorithms that take advantage of this design. Vectorizati
7 q* Y8 D8 _* a& B+ Won means converting& ?9 _, i' L: S7 G
for and while loops to equivalent vector or matrix operations.”。改进9 _6 \3 Y! C8 R5 v: x+ b
这样的状况有两种方法:
$ l- u/ X0 _3 Z( F1 @3 ], {# I, J" s4 g
a、尽量用向量化的运算来代替循环操作。如将下面的程序:
3 w8 b( Z& U9 {" a
4 a3 z- m2 {* I: [7 Ri=0;" ?" i) ~- m+ o/ W. S8 G0 w" m
for t = 0:.01:10% p; G! s% \0 v% _- i/ b; }
i = i+1;5 R0 d& Q) {1 d! Y$ Z0 S' I) d
y(i) = sin(t);1 E3 d# m& S$ `7 x. ?1 g6 S+ X j C
end
$ @; G* O; ]! p9 x+ Q7 N9 I替换为:& y( @; w, s8 M; j
t = 0:.01:10;8 f+ t o$ q4 L, R! \* A
y = sin(t);5 M7 [7 [* A1 y# i! a
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i
* `! t2 z# X5 ]6 l7 W; R, cpermute、permute、2 |/ E! C' w6 B7 q W
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums
- k) q5 X7 Y+ V, @8 B, [0 O' `um、ind2sub、 i" D4 E* j; C" z
ndgrid、repmat、sort、sum 等。& w7 a) B. k% R- J) I6 |- N$ _
/ n; V2 I2 g7 V6 G请注意matlan文档中还有这样一句补充:“Before taking the time to) _$ w1 L! y8 n$ B
& }$ g7 C+ y" R8 A5 s3 r+ S
vectorize your code, read the section on Performance Acceleration. F& q! b/ }$ B) N
You may be able to+ N5 @, I8 U, h! B1 P% M" C* L
speed up your program by just as much using the MATLAB JIT Accelera
5 O, W9 S) n4 H* r. ^tor instead of
4 c; q4 z1 Y1 z/ Y- U# Y; Ivectorizing.”。何去何从,自己把握。+ D5 Z1 D0 W7 N0 }* W$ q
, I$ A, o1 q, S7 lb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执# M" m" K9 j N( t0 t) R
行循环次数少的,
. J8 j, q: g/ c( ^ |& X/ \内环执行循环次数多的。这样可以显著提高速度。
9 W1 J& ?8 C# e6 n( x% C
7 y* q) j5 n* n1 g2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on: b0 @! n& H) G& ~8 v8 M
es、cell、struct、
. ~7 S4 E: d$ Urepmat等。
& ~/ Q7 s2 T, j- Qb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:
K d. Y. `7 X& `. Q/ j! H1 B. U t: o; S9 R; d
A = int8(zeros(100));
7 p/ `" _: w* P) y换成:
: s3 Q e$ `9 @. R" \8 C7 b' k- A6 tA = repmat(int8(0), 100, 100);
- C' n6 t( _, z& y2 S1 ^% C' @c、当需要扩充一个变量的大小、维数时使用repmat函数。4 f5 Q+ K! B5 m6 ~ X) y; _
, d! ^, @7 A6 e( i
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。5 F6 A {3 Z! K; [1 e. F8 T
b、使用Functions而不是Scripts 。
- c$ ^, z* H$ }- u% G8 [4 j " @5 j4 ]- O: B8 e9 L* W }
三、 绝招
2 u5 D5 Z3 [0 F+ t7 z
- ?& S0 u0 w% o0 D你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。
; i( B9 p% o% N% M5 b/ I1、改用更有效的算法3 t5 U4 Z; @' y% o }9 D
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
3 T( p( B) ~- u) P
# b& m2 T4 [" g N- `关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++
& ` _/ S4 a( h- v% }$ ]. i4 u语言文件,VC编译”。 |