QQ登录

只需要一步,快速开始

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

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

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

15

主题

4

听众

1807

积分

该用户从未签到

元老勋章

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

非常实用的Matlab编程技巧。可以试一试。

0 M8 l% E) ~2 ^; f

CTerm下载文章: 紫丁香★( ]$ e/ `& p1 g6 } h4 a' X' f 7 o; m7 `, F) S发信人: fork (撒哈拉沙漠的沙), 信区: Matlab : `7 z# W v5 _ 题: 加速matlab运行的三重境界0 q8 U& w; K& D7 M 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004). W% j* ^1 f/ O9 l! e4 R4 p - _: e+ a0 g/ X3 f0 @+ @# G加速matlab运行的三重境界/ }! o7 e$ y7 N' U) W$ B 一、 遵守Performance Acceleration的规则 , e, l6 m1 a. X& r0 a# R5 f! F二、 遵守三条规则7 ^4 ]% ~; z k 三、 绝招

/ h% U3 H; u1 _" V. U

一、 遵守Performance Acceleration的规则! Z5 Z3 q" H! A# k 5 A4 m; Y# v1 Y- U( z关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 1 N, _; _& Y9 [ A8 V其规则总结如下7条:6 Y$ E9 g" X1 i1 \9 S9 W' ]' I9 h, C9 L 1、只有使用以下数据类型,matlab才会对其加速: 9 v! E6 P7 h ylogical,char,int8,uint8,int16,uint16,int32,uint32,double1 w% } D9 G9 ?9 h1 X( H2 E0 n- A 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu9 T2 ]! f6 S8 y re,single,6 ]; T* c3 _9 | ! P+ B) d2 g2 s& |+ ` function handle,java classes,user classes,int64,uint640 Y; H: T" [1 _! N. W L% k3 F 2matlab不会对超过三维的数组进行加速。) u# T% C' }* ` 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值9 { |4 U0 x+ C1 R 来表示; # h& `! c; I# e$ z: C' wbfor循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 6 J. v3 z" [' A, W8 `' i, ^" L据类型,只使用- D" L' D- [2 _8 g) h- g 三维以下的数组;c、循环内只调用了内建函数(build-in function)。8 e8 Y! J3 h r& B8 A6 c, n4 E& v 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将. O% E! F1 ~! Q; q F& w5 W2 j& L 加速运行。7 p, ^9 x" ~2 e6 H, N0 { 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:# [5 ~6 E0 G l6 {" w9 f5 l' ^. Q2 L x = a.name; for k=1:10000, sin(A(k)), end; 1 Y2 o6 o' t" f/ v* `6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速" ?- z$ U' z, D# h; i2 u0 v 度。5 A: P! L, p8 G+ C 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低$ V& Z% E3 c7 u8 X* y9 q( b& X# p 运行速度。 ' T) Z% G5 D7 ]6 W: C) Y. S4 H& t& Q9 }! ` / @4 H5 T4 w4 J, [ I( B 二、 遵守三条规则2 I$ i7 s9 W1 T& N. e6 F & ]3 b$ L* s6 [" {; g% J. `( ^8 H1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic . R R( r1 k r( Q1 {1 eh means it is designed/ z- H R+ i2 K. H: i" X : d# r) q4 T# I. i# t for vector and matrix operations. You can often speed up your M-file c 9 c" B, A1 G1 W& X* K4 T& M6 h0 k7 vode by using + l8 R" f3 O' f" f4 e7 a. }vectorizing algorithms that take advantage of this design. Vectorizati) z: R% S, v! k6 S on means converting ; |8 ~" j0 A' B- pfor and while loops to equivalent vector or matrix operations.”。改进 / K; T' h' C; U3 H" G3 a. Z. ~这样的状况有两种方法: 5 `) \3 X4 [' k! a: b9 h1 [) u* [( f0 T; H+ k+ X; N a、尽量用向量化的运算来代替循环操作。如将下面的程序:) u; S) e+ M( K & Z8 t- i0 @5 b" c8 d gi=0; - U7 A# Q& Y5 m2 W( l$ ]5 i1 k+ {for t = 0:.01:100 G9 `- w, u# J3 ]6 f* l/ L i = i+1;5 i3 Y3 `1 I5 z ]6 q y(i) = sin(t); . `" s2 a& {1 ^6 hend & C4 U$ R6 N. q( j/ P9 t3 n( W9 h替换为:3 O& M2 N, D% R t = 0:.01:10;1 y% G6 Y+ T1 l* a y = sin(t);, T* f( b7 r. H0 i 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i) f( E, g7 h7 O8 z permutepermute、, e- P2 ^& T2 ~' H0 g z reshapesqueeze、any、find、logical、prod、shiftdim、sub2ind、cums # y' D! D- o$ `. {) G6 uumind2sub、 ) v/ m( b9 I. S5 L2 L. mndgridrepmat、sort、sum 等。 - V4 V4 A \: o5 b2 x5 o4 B. _& M. K' _% o% i 请注意matlan文档中还有这样一句补充:“Before taking the time to( o- U9 x& S) N3 m ; U9 o& Y8 R( X7 R, ~. V2 Pvectorize your code, read the section on Performance Acceleration. , Y3 i( }5 | D4 JYou may be able to; ~; q" U( n8 K' |' @2 }0 ~ speed up your program by just as much using the MATLAB JIT Accelera % b: o# S. E- b, {" `; X4 e8 Ntor instead of $ T0 v/ w" V% r4 ?: x; \! Jvectorizing.”。何去何从,自己把握。: [& T7 G" i4 x5 l) @+ h/ X " |! Z. E8 R& g# I b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执7 U% e4 l I$ {" }5 U. o# M+ N 行循环次数少的, 6 a6 v8 H4 X/ m `内环执行循环次数多的。这样可以显著提高速度。6 i! s& s0 O0 }: h ?% Q ) t( Q# X: w( W5 s 2a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on9 D, r n3 m1 c+ {1 v escell、struct、6 p9 U0 h- P/ x1 @) D repmat等。! L! c/ c% M3 `8 [1 s8 F b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: . |4 W( d5 G4 s" c7 R# ]& X# Y7 ^6 {: p+ C2 U0 W A = int8(zeros(100)); y3 w$ k) e0 @* c2 r# I 换成: * }' ]# I: H3 w0 W1 L4 YA = repmat(int8(0), 100, 100); 9 E! b& y7 f! F0 W& pc、当需要扩充一个变量的大小、维数时使用repmat函数。4 h6 a. R: E: ~5 y / r2 O( |8 v+ T' h8 p3a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 & y& p( ~9 ?; A- V9 ~2 W% Q Rb、使用Functions而不是Scripts 。 4 w/ I- k& d: ^9 ~% Y! Q7 G" \. K% K. {) e/ D ; x$ `; l- ]7 z+ g3 m. ?; w三、 绝招7 D r# M7 z# q! {1 V. n5 } 8 D/ U& a) h, H 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。$ M( I E$ `$ M; V& v7 f 1、改用更有效的算法7 x( G* P# N4 z* @5 q+ Z( _4 I! j- H% B 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 . a+ f# Y, I' U h! j $ h) w \2 O5 ]关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++; y' w' B4 K' h7 P 语言文件,VC编译”。

3 u" d/ n% s6 [* `

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

0

主题

3

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

echo5183        

0

主题

3

听众

24

积分

升级  20%

该用户从未签到

新人进步奖

回复

使用道具 举报

zzm        

0

主题

2

听众

28

积分

升级  24.21%

该用户从未签到

新人进步奖

回复

使用道具 举报

1

主题

2

听众

114

积分

升级  7%

该用户从未签到

回复

使用道具 举报

yirongshu        

0

主题

2

听众

182

积分

升级  41%

该用户从未签到

回复

使用道具 举报

txj66        

2

主题

2

听众

42

积分

升级  38.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

ethuo        

1

主题

2

听众

84

积分

升级  83.16%

该用户从未签到

新人进步奖

MATLAB编程是不是很慢阿??

8 o3 m% ^0 i5 F5 n5 s( q! D

比不上现在的那些高级程序语言啊?

回复

使用道具 举报

ghc_lwd        

0

主题

2

听众

46

积分

升级  43.16%

该用户从未签到

新人进步奖

回复

使用道具 举报

damutou        

3

主题

2

听众

592

积分

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

    [LV.4]偶尔看看III

    群组学术交流A

    群组学术交流B

    群组A题

    群组B题

    群组C题

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-6-15 00:43 , Processed in 0.512074 second(s), 106 queries .

    回顶部