QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3765|回复: 6
打印 上一主题 下一主题

加速matlab运行的三重境界

[复制链接]
字体大小: 正常 放大
zzwszj        

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

跳转到指定楼层
1#
发表于 2004-12-21 11:00 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab% Y( b9 j$ y) w/ |; z" _5 Z! s 标 题: 加速matlab运行的三重境界0 Q! G2 U$ k% G1 d: w 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)2 l7 m7 U1 F/ A7 G% A V. X7 N- K' | q; o; _" [" M 加速matlab运行的三重境界

# m- V" N4 F% k2 z- P6 t( u$ [1 s& u4 K' Q

一、 遵守Performance Acceleration的规则# w# H& W% n! [6 ~3 {9 p8 v/ N 2 f, x% [* J# t4 j4 u 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 l2 g. W- N9 [# V" [9 r5 i/ Y其规则总结如下7条: - h- \, L; C4 I* u& @1、只有使用以下数据类型,matlab才会对其加速:$ U! w3 b! h; Y9 B logical,char,int8,uint8,int16,uint16,int32,uint32,double # Z2 Z+ q3 Y9 |8 m* E8 N9 h而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu * g1 N8 G, Z" d9 c% }" c+ H6 lre,single, " \1 j5 v$ v9 n" Q$ W/ s( e5 U. D5 i0 F6 v function handle,java classes,user classes,int64,uint64# E- m" ~2 I4 q+ E4 M& [$ n 2、matlab不会对超过三维的数组进行加速。 : D; _' e2 b. g, l3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值8 N* L0 t0 k C% y: H& V 来表示; ! B6 T# R. T W8 Q% @! d3 n7 Sb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 . h6 } B* D# X7 N+ x; K$ M据类型,只使用# W0 D: y1 \5 `. L 三维以下的数组;c、循环内只调用了内建函数(build-in function)。8 }( h9 `7 c; F7 G 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将& q# V, \5 _- S* n$ b# j$ ` 加速运行。$ s9 Z6 O, X/ l% K 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: ) g% k& N; X; L" a3 g0 sx = a.name; for k=1:10000, sin(A(k)), end; & Q8 e( y) [6 R6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 1 L# [! T0 q8 B0 K v" U0 j度。 ! p# |! r& e4 G- y; H& u7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 3 x5 B. q( O( Y% z. U运行速度。 ; O$ K! t' R5 T

/ N0 @' r" l6 y: V* f/ k

二、 遵守三条规则 # V2 f6 ^7 R0 T( q0 P5 R; @( T7 W) P& S7 }. g+ I 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic* f& q" E/ E! Q3 q4 _ h means it is designed ( v# A/ [& z; A; F8 E ! F" J: G0 u" v$ Z0 u/ \for vector and matrix operations. You can often speed up your M-file c ) N6 N8 e {8 T& g3 kode by using 2 d% \: X4 |+ @& \; Uvectorizing algorithms that take advantage of this design. Vectorizati# G3 d) }: C1 ~9 E h" b! i0 ~* r on means converting4 `3 `3 T8 @% ] for and while loops to equivalent vector or matrix operations.”。改进' t) ?5 H0 V) Z9 L 这样的状况有两种方法:1 t% }+ t9 D( R6 A2 X h 6 G/ D1 ^- k) ]4 Ma、尽量用向量化的运算来代替循环操作。如将下面的程序: W7 L$ _! I0 u3 c7 U' b) b* q/ g/ q 0 _- [2 y) C3 i& l) j4 o. t* W0 [i=0;6 y. L6 {' l- e$ L+ h for t = 0:.01:10 * {0 D0 R: e+ L- }' [- s" ], Ri = i+1; & b, m T$ u$ t% }% a1 |. R# Py(i) = sin(t);% {! Q; w9 u7 a3 d% P& B end9 c2 R3 f) _) d0 e3 A. w/ f' U; i 替换为: + N l# ^8 l0 h4 W$ U* T! lt = 0:.01:10; ( F' ^+ L2 I0 y6 ^: r, d$ c* d! uy = sin(t); 4 `6 U; g# s' {6 h6 q3 D) Y速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i; O1 u' |, e+ H3 S, h permute、permute、 ) \9 k. r& U. \0 R5 }2 n8 ireshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums 5 t8 K3 l% C0 T" \3 Vum、ind2sub、 3 j0 X3 l, f9 q* F2 j3 Hndgrid、repmat、sort、sum 等。' R4 v2 G/ p7 A% A8 g$ U7 h4 R( F. ? 0 s1 i) }& ~6 |1 c- o, q 请注意matlan文档中还有这样一句补充:“Before taking the time to$ A7 v7 s6 t5 w" G& o* y; p. v + l' A x. |7 H0 v0 B Y2 [' [vectorize your code, read the section on Performance Acceleration. " K/ h. T1 n8 P% C" hYou may be able to 4 l2 x4 W8 x& ^ m9 }4 v0 V9 ?, l* |speed up your program by just as much using the MATLAB JIT Accelera! A( n! e9 }/ _4 ?$ t2 `+ w tor instead of/ I* w, s# `; Q# y( U vectorizing.”。何去何从,自己把握。 - M8 q1 l6 a( y4 z" X! b+ A% m6 a) Q( Y3 C2 R: n b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执 : z5 V. U1 d) t7 ]! Z8 q行循环次数少的,6 ~6 X# E1 {2 p5 V, p7 y; _3 x 内环执行循环次数多的。这样可以显著提高速度。 * D/ U1 }3 x3 U 3 D9 [- t+ ^7 |0 s2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on 5 `& d# t5 l, r- yes、cell、struct、 5 Y; H2 e* }6 G8 w- h$ p1 Prepmat等。 0 H( E$ j( d9 c# o- db、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:2 @: _1 o% ]8 m# u# H % y& Q; C( [4 `2 v+ k _ A = int8(zeros(100));2 B) P! o/ E) t 换成:5 ]- y4 p" k' Q A = repmat(int8(0), 100, 100);* w+ }* C- T% F6 i p c、当需要扩充一个变量的大小、维数时使用repmat函数。6 f8 U5 {* Q8 c ' E9 Y% u+ G- y0 ^" Y- Z6 k- `3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 0 p! X4 p$ m [1 N, u9 @b、使用Functions而不是Scripts 。" h- j- d& s$ P7 j8 S; [* k

9 d: I6 H$ d" C6 l, d# s

三、 绝招 ! e( x$ g5 H' K3 g1 D" }" Q/ }# q( h: `/ _4 }- W" \& i: Z+ `% t 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 ! u1 Y9 ]! L: [5 H1、改用更有效的算法, d! Y- w* [/ I" T 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 t6 V5 a8 {, ^% y' ~) o . K W7 X, A2 k0 e+ x* K T8 n关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++# V# J7 \8 y* ~! @' Y( o 语言文件,VC编译”。

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

这是一个关于数学、物理、英语的网站。有很多免费资源!

http://zuozw.blogcn.com

fup        

0

主题

2

听众

43

积分

升级  40%

该用户从未签到

新人进步奖

回复

使用道具 举报

ornewuser        

0

主题

2

听众

23

积分

升级  18.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

zzwszj        

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

注意

3 _* j- C( D" \

加速之前应该先测试 . }. A: H2 ^# D) @- Z2 U& q' L3 w5 n) [7 H使用profiler可以获得程序各个部分的耗时( A9 ]$ B# R1 h% [$ h, _2 ` 如此就能高效的加速8 N' t: u9 e$ I6 P, f$ h

0 @2 d( I4 ^+ s: T$ H8 o

因为有的时候导致速度变慢的原因是逻辑结构不合理,+ z; c2 q( R, R2 x/ O 而不涉及程序技术

+ \$ j! S3 |/ O4 s% r

这是一个关于数学、物理、英语的网站。有很多免费资源!

http://zuozw.blogcn.com

回复

使用道具 举报

0

主题

0

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

0

主题

0

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

布赖        

4

主题

2

听众

134

积分

升级  17%

该用户从未签到

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册地址

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

手机版|Archiver| |繁體中文 手机客户端  

蒙公网安备 15010502000194号

Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

GMT+8, 2026-4-10 04:57 , Processed in 0.692090 second(s), 91 queries .

回顶部