QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab7 v. P* |6 R: A0 t: k 标 题: 加速matlab运行的三重境界 " c2 l6 [7 B" t发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)2 l: d- ]1 n3 a# \7 j/ B ( Z6 W5 c6 K d- K5 [, L1 V0 E7 z 加速matlab运行的三重境界

. `. @6 ]5 A c1 h) M 2 Z% q' W( A4 c' ? |9 \

一、 遵守Performance Acceleration的规则4 d, V* T. s/ g' v* y1 p 2 ~6 V! w5 t. D; Q, X9 q6 I w D 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将7 w/ ~ N7 N; o( n$ X6 D3 _$ J' j l 其规则总结如下7条: % ?- l' K, \4 Q7 f1、只有使用以下数据类型,matlab才会对其加速: 4 n/ g& f' P$ L! g. Flogical,char,int8,uint8,int16,uint16,int32,uint32,double" }4 k1 g1 a3 K 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu( Z5 b% B& P, m# X' J re,single, % H; u8 I% S5 E0 H; S6 h' H7 g$ X" \/ G7 Y function handle,java classes,user classes,int64,uint64" h" M' I9 @5 G: `* [3 E 2、matlab不会对超过三维的数组进行加速。, \ @* o. \0 P; m6 ^ 3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值& `3 ]8 |9 a+ c, Q" g# O 来表示; 7 Z. X) |6 Y7 Eb、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 . r) Q# P4 i4 n7 Y4 }; Q- k" t' x据类型,只使用 . d9 _8 \- R% X5 j6 P三维以下的数组;c、循环内只调用了内建函数(build-in function)。 ) R7 V/ g" e7 r+ |! {4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将* d+ T0 P( ~% B/ m4 b$ |# z; O 加速运行。9 n4 {8 n) e% N X 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:6 M' l `5 n+ q9 h! ~( N; I/ v5 l0 i* S x = a.name; for k=1:10000, sin(A(k)), end; 2 S+ a5 e) S' f, ~0 I6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速3 c6 Y: ?2 e# ]/ w8 B4 I( R 度。6 s* k. o. x6 {* D 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 ( t! U( V4 _' J9 K9 [ T运行速度。" k+ x6 z- j7 {

8 A4 Z; Q' N( ^! o# k- X

二、 遵守三条规则4 {# q ^ t9 \5 S% J5 i: U H3 P $ ~. W- J* {4 U3 i; h" }1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic - {: \5 h6 y4 N3 Uh means it is designed ; G# K# U" @) m" o5 `7 f1 d5 H; T1 Q" ^2 v for vector and matrix operations. You can often speed up your M-file c! Z. F% E( g0 n% h5 b9 D ode by using / x# t/ ? x6 V- K. Q4 ]; D$ [vectorizing algorithms that take advantage of this design. Vectorizati 9 i* q+ M$ H' P& R8 Ion means converting $ e& b, _ m' G+ j0 Wfor and while loops to equivalent vector or matrix operations.”。改进 9 R3 \+ X8 B% b% k3 B) d这样的状况有两种方法: / R0 {. i8 T. f; z2 V2 k+ S) F ; l7 m* x/ s3 ?8 Z. j8 ^a、尽量用向量化的运算来代替循环操作。如将下面的程序:' q6 R; K" J9 V2 x" c ! e; m$ U$ g! C! D* g, L+ C: l. q0 Ji=0;6 _1 V2 V" H4 G9 l for t = 0:.01:10 " r. u; V, h1 a! i1 yi = i+1; : u7 y9 A4 P& _4 _y(i) = sin(t); 9 U6 Q, i, } T4 @* Q. Vend, y4 M" \0 o- ^: d0 D 替换为: , W1 C/ l+ K4 A; h4 L% I6 ~7 Vt = 0:.01:10;( o! u: |5 Z4 f5 f y = sin(t);* j, p; a# q: X* z 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i # x e5 J+ a' D7 {* b1 tpermute、permute、 8 S! b1 N1 m2 F5 \' \& [6 y" h8 p) Freshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums( e4 Z! I: p. {# ]$ \8 l um、ind2sub、 $ h: o; s$ W+ L/ ]ndgrid、repmat、sort、sum 等。3 R' r& m. a( k' q- v' @1 g8 m # v. o/ Z- ^; S7 W" u4 |0 Q; W4 h请注意matlan文档中还有这样一句补充:“Before taking the time to$ `' Z, m& z f 9 P! [9 a7 M2 _+ i" V2 f- |2 [# Y; \ vectorize your code, read the section on Performance Acceleration. ) h7 u. h. S8 ?- z" SYou may be able to 1 b$ v( J5 M/ a: U) b( gspeed up your program by just as much using the MATLAB JIT Accelera6 D! R1 f+ M- _1 I5 {+ w0 S! w- ^ tor instead of- S; J8 s7 f2 b- {2 q, z vectorizing.”。何去何从,自己把握。 C3 { H+ b5 M( F6 H6 u& |" o% Y$ c b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执: B' s3 p8 `# v) y) U& T/ r 行循环次数少的, ! C& N% Q# f$ z$ o内环执行循环次数多的。这样可以显著提高速度。 4 t* o6 Z$ @5 }. N : I% S, x; y9 X3 X; b( q2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on # E: O$ h5 I% W4 ]$ aes、cell、struct、 m2 J% F, F0 Z: ~7 p+ v& |" Hrepmat等。 # z, j. f6 \1 [' Cb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:+ u) j0 z: ~6 t+ p" ^! @" F 7 n2 r' j- y) P( P5 c- n) wA = int8(zeros(100)); ( w8 S# T* f* ^! P0 A9 ^! a$ I5 F2 O换成:: P% }4 q1 H# C A = repmat(int8(0), 100, 100);. \& F$ J+ [6 b' M1 ~* S6 A c、当需要扩充一个变量的大小、维数时使用repmat函数。 7 s3 z& O8 _; D$ @# i+ r3 ^- R9 p& o6 Q7 e 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。 1 \0 {; P% ^1 w6 \% F$ D2 R8 Eb、使用Functions而不是Scripts 。) U, K8 y8 t- }+ Z# b

* H4 X' S" q9 L' j1 |( m8 E

三、 绝招1 X3 x& _( ?8 L4 z/ g- K+ B0 ? : o8 z B/ P7 ?' E, L, K 你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。% D% k! J$ b9 U$ c5 J9 L 1、改用更有效的算法 * l' }+ A- L2 t8 d5 b& _8 `% c8 m6 z2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。/ Z4 Z+ M; k& x3 k + r' G; w; ?9 W1 ~关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ : F! j$ s; U. @" G语言文件,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%

该用户从未签到

新人进步奖 发帖功臣

注意

0 l$ s; C0 P c( Q

加速之前应该先测试 * b% ?9 Z: Z& @. I! {/ K/ O使用profiler可以获得程序各个部分的耗时1 B5 u: H( R9 p$ J6 v2 k 如此就能高效的加速/ D8 K* s# ?2 X9 F3 h( X

" E$ s- x; z3 ?+ p5 z

因为有的时候导致速度变慢的原因是逻辑结构不合理, - i# X E( H' _2 ]" Z& \1 u而不涉及程序技术

9 l8 i7 @" _8 g: V$ _

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

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-7-10 09:13 , Processed in 0.383267 second(s), 91 queries .

回顶部