QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab : ^8 a( w5 l& p2 e- [8 r+ Y标 题: 加速matlab运行的三重境界! }, b6 J4 R Y6 f 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004)7 u7 \; m ~* t+ W( o4 }. { * J* E M5 Z8 r+ |0 H加速matlab运行的三重境界

* m; D/ t8 t& E( D1 n ; m# j. M D' M+ V" ]4 ?7 W

一、 遵守Performance Acceleration的规则( @9 |7 N: |# V0 ?6 e6 Y% x+ i 3 b- m$ G) u$ `, U1 y% o! G3 C 关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 ( ~: v- X% D% S4 W" U1 x) F其规则总结如下7条: . K! _/ H1 N6 F" q) U1、只有使用以下数据类型,matlab才会对其加速:) W) Y; |' e* m5 x1 n+ R2 O t; D' L6 L logical,char,int8,uint8,int16,uint16,int32,uint32,double% u5 Y, A' K& j2 ^% B' a 而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu ( m7 X, y. ^! ?9 r% N$ dre,single,* B- P) I3 J; l# P! T % L* K1 c1 k$ \, D/ Cfunction handle,java classes,user classes,int64,uint64% O' x5 @1 u# e# l( x 2、matlab不会对超过三维的数组进行加速。 $ G8 `( \6 q i6 S1 Y3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 + R% X1 \8 ?4 ] n" k# g0 v来表示;5 X5 p9 z- `( N0 F b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数 $ J& n' F2 v% j( @0 Y8 L9 @7 B据类型,只使用% P1 n0 ~3 u" s9 G 三维以下的数组;c、循环内只调用了内建函数(build-in function)。( l! p8 r, L! @) @ 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将. Y( e/ z2 t% G: D6 b2 m& j 加速运行。 ! q; _4 u6 s( O* Y% k5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句: 0 G }2 M% m5 l ~3 G! w% b5 Zx = a.name; for k=1:10000, sin(A(k)), end;; [1 Z. h% B. B( \2 E; |5 T( P6 N 6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 `+ A1 K! n# V 度。 ; c! ~4 R/ W1 y* l( ]5 m, J% e# A7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低7 v. E2 U2 {3 M3 Z# W! d! N 运行速度。 5 J3 |, z, y( u* ]

- F8 _6 u0 i9 [. p6 ^

二、 遵守三条规则 8 ?/ g( I4 j4 B( C3 Q# s. S ( O8 `2 t- N; _& W ^1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic q: n3 B/ N. g! w h means it is designed # S5 m0 p% Z/ j" D/ W5 ^7 u# _6 Y5 j/ G4 S5 F, U: z for vector and matrix operations. You can often speed up your M-file c 6 h" C8 Y' U. m8 o; {7 g3 Sode by using: R$ d) }9 i$ h7 P+ p vectorizing algorithms that take advantage of this design. Vectorizati 7 q* Y8 D8 _* a& B+ Won means converting& ?9 _, i' L: S7 G for and while loops to equivalent vector or matrix operations.”。改进9 _6 \3 Y! C8 R5 v: x+ b 这样的状况有两种方法: $ l- u/ X0 _3 Z( F1 @3 ], {# I, J" s4 g a、尽量用向量化的运算来代替循环操作。如将下面的程序: 3 w8 b( Z& U9 {" a 4 a3 z- m2 {* I: [7 Ri=0;" ?" i) ~- m+ o/ W. S8 G0 w" m for t = 0:.01:10% p; G! s% \0 v% _- i/ b; } i = i+1;5 R0 d& Q) {1 d! Y$ Z0 S' I) d y(i) = sin(t);1 E3 d# m& S$ `7 x. ?1 g6 S+ X j C end $ @; G* O; ]! p9 x+ Q7 N9 I替换为:& y( @; w, s8 M; j t = 0:.01:10;8 f+ t o$ q4 L, R! \* A y = sin(t);5 M7 [7 [* A1 y# i! a 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i * `! t2 z# X5 ]6 l7 W; R, cpermute、permute、2 |/ E! C' w6 B7 q W reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums - k) q5 X7 Y+ V, @8 B, [0 O' `um、ind2sub、 i" D4 E* j; C" z ndgrid、repmat、sort、sum 等。& w7 a) B. k% R- J) I6 |- N$ _ / n; V2 I2 g7 V6 G请注意matlan文档中还有这样一句补充:“Before taking the time to) _$ w1 L! y8 n$ B & }$ g7 C+ y" R8 A5 s3 r+ S vectorize your code, read the section on Performance Acceleration. F& q! b/ }$ B) N You may be able to+ N5 @, I8 U, h! B1 P% M" C* L speed up your program by just as much using the MATLAB JIT Accelera 5 O, W9 S) n4 H* r. ^tor instead of 4 c; q4 z1 Y1 z/ Y- U# Y; Ivectorizing.”。何去何从,自己把握。+ D5 Z1 D0 W7 N0 }* W$ q , I$ A, o1 q, S7 lb、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执# M" m" K9 j N( t0 t) R 行循环次数少的, . J8 j, q: g/ c( ^ |& X/ \内环执行循环次数多的。这样可以显著提高速度。 9 W1 J& ?8 C# e6 n( x% C 7 y* q) j5 n* n1 g2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on: b0 @! n& H) G& ~8 v8 M es、cell、struct、 . ~7 S4 E: d$ Urepmat等。 & ~/ Q7 s2 T, j- Qb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码: K d. Y. `7 X& `. Q/ j! H1 B. U t: o; S9 R; d A = int8(zeros(100)); 7 p/ `" _: w* P) y换成: : s3 Q e$ `9 @. R" \8 C7 b' k- A6 tA = repmat(int8(0), 100, 100); - C' n6 t( _, z& y2 S1 ^% C' @c、当需要扩充一个变量的大小、维数时使用repmat函数。4 f5 Q+ K! B5 m6 ~ X) y; _ , d! ^, @7 A6 e( i 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。5 F6 A {3 Z! K; [1 e. F8 T b、使用Functions而不是Scripts 。 - c$ ^, z* H$ }- u% G8 [4 j

" @5 j4 ]- O: B8 e9 L* W }

三、 绝招 2 u5 D5 Z3 [0 F+ t7 z - ?& S0 u0 w% o0 D你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 ; i( B9 p% o% N% M5 b/ I1、改用更有效的算法3 t5 U4 Z; @' y% o }9 D 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 3 T( p( B) ~- u) P # b& m2 T4 [" g N- `关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++ & ` _/ S4 a( h- v% }$ ]. i4 u语言文件,VC编译”。

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

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

http://zuozw.blogcn.com

布赖        

4

主题

2

听众

134

积分

升级  17%

该用户从未签到

回复

使用道具 举报

0

主题

0

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

0

主题

0

听众

21

积分

升级  16.84%

该用户从未签到

新人进步奖

回复

使用道具 举报

zzwszj        

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

注意

* I, |" P8 {! g& M) i

加速之前应该先测试 / T9 l" ?1 u% Q使用profiler可以获得程序各个部分的耗时 ) R3 c) I2 d: b; p如此就能高效的加速 $ Z f6 C4 o+ z8 X: g( v9 e

. j: S* Z, L* D' e* g \8 K/ e# [( y

因为有的时候导致速度变慢的原因是逻辑结构不合理, 5 m! j$ C( K: o0 C2 M而不涉及程序技术

2 s* p! b% W) H" b3 o

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

http://zuozw.blogcn.com

回复

使用道具 举报

ornewuser        

0

主题

2

听众

23

积分

升级  18.95%

该用户从未签到

新人进步奖

回复

使用道具 举报

fup        

0

主题

2

听众

43

积分

升级  40%

该用户从未签到

新人进步奖

回复

使用道具 举报

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

qq
收缩
  • 电话咨询

  • 04714969085
fastpost

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

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

蒙公网安备 15010502000194号

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

GMT+8, 2026-7-10 12:01 , Processed in 0.474512 second(s), 89 queries .

回顶部