非常实用的Matlab编程技巧。可以试一试。 ! ?$ ^( g& {% f& f8 H& u; k* J& i
CTerm下载文章: 紫丁香★2 g: }5 O# V# F2 Y) W
: h, | c. ?* `1 F; s发信人: fork (撒哈拉沙漠的沙), 信区: Matlab
9 Q4 P7 n- j4 W标 题: 加速matlab运行的三重境界
2 ]6 d, d% J ]. I) c g发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)" ~. \6 L& g2 ^* a8 [6 H" s
# N: f( R0 f1 d2 ^$ }8 C加速matlab运行的三重境界9 y5 r, B3 o6 P3 U0 F" W" b
一、 遵守Performance Acceleration的规则
0 @, a7 n- n. U; T- y( Z N m; V0 T二、 遵守三条规则
: r0 p p' v. V8 b* i+ K三、 绝招
: w5 |+ D5 F7 x9 C一、 遵守Performance Acceleration的规则' r2 F3 _( [! i/ }8 l: ?
5 G$ Z- N; E: f) l' g8 }
关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将1 x2 m3 K2 _7 v: ]% ?8 D9 b
其规则总结如下7条:. e* o x) y$ X( [$ ~
1、只有使用以下数据类型,matlab才会对其加速:0 Y0 @( R# m( U$ z7 U+ p1 q4 U; f
logical,char,int8,uint8,int16,uint16,int32,uint32,double# L! I, D0 |2 p7 E( [) p4 P4 ~
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu3 h, n, ~& n/ |, P
re,single,* b% U' z- j ?9 A
" E( C* N; \( {0 p* Kfunction handle,java classes,user classes,int64,uint64
6 a9 z6 f7 B' v- [2、matlab不会对超过三维的数组进行加速。
, v- E, }% f2 {: f! d8 {3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值
& `- q+ S* e# Z来表示;7 T0 j4 L4 X# A0 K- C8 D# @' O0 U
b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数. b+ ^. z" R1 h- n
据类型,只使用
! h; g6 U+ ~9 r三维以下的数组;c、循环内只调用了内建函数(build-in function)。
% l% G# L3 H* [9 v4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将
$ L: [; L- S3 E) C F M: g* j加速运行。# X+ z0 V# K F+ L3 G C, q
5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:
# z1 k# z* W6 l3 V1 A0 a8 Ex = a.name; for k=1:10000, sin(A(k)), end;
+ ~# W; Z, q4 n5 A; B# J$ H9 Q6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速
( V( }& Q' p( M$ J度。
; ?5 N' v+ }2 n0 J# v1 z, P7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低# e0 ? C2 J8 Q) Z3 Y
运行速度。! H s0 v9 O3 M# C
% I/ U3 u9 M& C; a) [
6 \& h2 J) o8 R* j二、 遵守三条规则' ]* z' W( J" [- `7 z" T, X% |
, e& W! O) f" T( b1 Q* k
1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic, u* |/ |' @4 \8 J
h means it is designed
7 {/ F( |2 {" J# ]) A) g/ ?
' F' @# _7 h) ?& w# a$ g' ?" ifor vector and matrix operations. You can often speed up your M-file c
. Q3 t- T; L0 E9 oode by using
) w+ }1 h6 d9 I( gvectorizing algorithms that take advantage of this design. Vectorizati m7 Z4 Z2 f- L5 d0 t6 ]9 q2 |
on means converting& ^% x7 b6 O( A! H K' d
for and while loops to equivalent vector or matrix operations.”。改进
; w9 D7 D2 n6 m# r F1 t+ x这样的状况有两种方法:
; z$ `( q" n' |5 Q; p
4 k0 h8 b H" ]" z: Ha、尽量用向量化的运算来代替循环操作。如将下面的程序:1 I |7 S8 K. b4 \3 K
; D5 S6 U: u1 j) |3 ^
i=0;/ F% d- v# P# @" O# x& O: h% k
for t = 0:.01:10
. G- [ w$ \% f6 C: b5 Qi = i+1;
# H8 N$ l) E- q+ F9 h# I6 c0 vy(i) = sin(t);
3 M' O" L2 A' \3 y. \9 j* |. `end
8 q& g( G: h- J替换为:- \6 X; o9 n: h9 d% J4 o
t = 0:.01:10;
, I/ F9 W# H9 v7 A. d* Ry = sin(t);' b$ \) H7 B0 c1 t, X/ X
速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i: `0 M6 r' A1 L3 Z; O) z; `
permute、permute、; z) Y7 v( w; ~
reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums. t1 M3 W/ ~( Z% W" s3 u- V0 R
um、ind2sub、
3 z$ m, l# ? R, b; `- Y! ~ndgrid、repmat、sort、sum 等。
4 e6 B3 ]* `6 S. F+ e+ u( Q: E2 y- O+ I# y0 @0 Z' V) e2 Y
请注意matlan文档中还有这样一句补充:“Before taking the time to
; s+ b4 P: n: F, ^' w/ Q) H* ]" |$ M' c* x K( Y# _# d2 A/ i/ o$ y* @& \
vectorize your code, read the section on Performance Acceleration.0 n* P! a8 R: o, @) b5 P
You may be able to
' v. K- C0 G b E( vspeed up your program by just as much using the MATLAB JIT Accelera# h0 W/ b" R& ~3 ^
tor instead of( Y, P7 l) S% P$ L& {
vectorizing.”。何去何从,自己把握。
, W" V5 P9 e0 v' L4 E) Y
, C- l* E6 {+ l9 T5 ?8 ^ zb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执
4 i2 Z6 w! R' k行循环次数少的,1 \0 x" x. z" A1 m+ i
内环执行循环次数多的。这样可以显著提高速度。. n7 F% X4 C( D1 N- Y+ }. I
6 s3 @ i+ G" [9 Q
2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on8 A5 J* h. _2 e4 w
es、cell、struct、
" ?; p, I5 m1 U% S. `repmat等。
6 ~) n9 f" n# M9 o0 b0 ib、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:. S X, H5 L+ c7 I& g! T( @
2 r. K( C0 C/ |; \* w4 ~# D4 _A = int8(zeros(100));
3 N D" c/ S" ]& g# q. e换成:& V, S: ]7 B) y2 n- X: C& u6 |" q
A = repmat(int8(0), 100, 100);
5 ^9 j! `! k$ yc、当需要扩充一个变量的大小、维数时使用repmat函数。
; u" H: ]( R9 H1 H" {* \$ e. h3 e0 p. x; [, a
3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。
. w- ^7 v V4 t) O, w8 [+ g5 _b、使用Functions而不是Scripts 。
1 V1 \9 c7 x! s9 n7 ~) B e8 \1 l
# i8 S7 Q9 z+ O- T8 p
3 |5 {; S! i* C# o# t: O三、 绝招
& _# j. ?6 a2 v; d5 a3 l" }* D w8 ?" t7 q3 [3 g" l
你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。$ ~! p+ }4 r p2 `& R7 ^
1、改用更有效的算法, `; X' K$ v# v! n( [
2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。$ E. g+ T+ S0 Y( q: Q G* U9 q, J
& N; t3 J# [- n9 @; c! G关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++! ?% z2 `; S3 D0 w
语言文件,VC编译”。 2 D5 Z5 D/ c; g) a+ v0 q- j
|