QQ登录

只需要一步,快速开始

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

[转帖]加速Matlab运行的三重境界

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

15

主题

4

听众

1807

积分

该用户从未签到

元老勋章

跳转到指定楼层
1#
发表于 2005-2-1 19:34 |只看该作者 |倒序浏览
|招呼Ta 关注Ta

非常实用的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- [2matlab不会对超过三维的数组进行加速。 , v- E, }% f2 {: f! d8 {3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 & `- q+ S* e# Z来表示;7 T0 j4 L4 X# A0 K- C8 D# @' O0 U bfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数. 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; ` permutepermute、; z) Y7 v( w; ~ reshapesqueeze、any、find、logical、prod、shiftdim、sub2ind、cums. t1 M3 W/ ~( Z% W" s3 u- V0 R umind2sub、 3 z$ m, l# ? R, b; `- Y! ~ndgridrepmat、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 2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on8 A5 J* h. _2 e4 w escell、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 3a、优先使用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

zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
一颗沙里看出一个世界 一朵野花里有一座天堂 把无限放在你的手掌上 永恒在一刹那里收藏 --英国诗人布莱克《天真的预示》
aftermath        

0

主题

0

听众

49

积分

升级  46.32%

该用户从未签到

新人进步奖

回复

使用道具 举报

nightgril        

2

主题

2

听众

19

积分

升级  14.74%

该用户从未签到

新人进步奖

回复

使用道具 举报

damutou        

3

主题

2

听众

592

积分

  • TA的每日心情
    难过
    2014-5-5 19:58
  • 签到天数: 25 天

    [LV.4]偶尔看看III

    群组学术交流A

    群组学术交流B

    群组A题

    群组B题

    群组C题

    回复

    使用道具 举报

    ghc_lwd        

    0

    主题

    2

    听众

    46

    积分

    升级  43.16%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    ethuo        

    1

    主题

    2

    听众

    84

    积分

    升级  83.16%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    txj66        

    2

    主题

    2

    听众

    42

    积分

    升级  38.95%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

    yirongshu        

    0

    主题

    2

    听众

    182

    积分

    升级  41%

    该用户从未签到

    回复

    使用道具 举报

    1

    主题

    2

    听众

    114

    积分

    升级  7%

    该用户从未签到

    回复

    使用道具 举报

    zzm        

    0

    主题

    2

    听众

    28

    积分

    升级  24.21%

    该用户从未签到

    新人进步奖

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2025-8-20 07:12 , Processed in 0.812978 second(s), 108 queries .

    回顶部