QQ登录

只需要一步,快速开始

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

加速matlab运行的三重境界

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

37

主题

2

听众

557

积分

先知

升级  85.67%

该用户从未签到

新人进步奖 发帖功臣

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

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab0 U# a. }; P/ F: Q, U/ S 标 题: 加速matlab运行的三重境界7 ]" v# ?& v: T6 M! [' R 发信站: BBS 哈工大紫丁香站 (Thu Jul 1 14:27:30 2004) / ]( \& A9 J( ]' [& Z' J$ T4 X' H2 q 加速matlab运行的三重境界

' ?# w/ T4 \1 f) V, l/ ~( C $ z$ w; @! _2 m' \4 j5 x

一、 遵守Performance Acceleration的规则$ r6 R% O% P. M# K, P4 U * D; e5 g T" S9 o% c关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将 , n7 F" N$ J: o' r4 K- H: [其规则总结如下7条:% v2 m) C. x7 _ L+ x 1、只有使用以下数据类型,matlab才会对其加速:4 n$ x% i" g1 h) \ logical,char,int8,uint8,int16,uint16,int32,uint32,double 1 `/ C1 E, C N% k/ q而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu 2 D0 i5 y1 j* R0 jre,single, 9 q8 [" }& i/ G+ o. u1 s2 y0 m+ N* b9 D function handle,java classes,user classes,int64,uint64 ( w& q& Z6 v6 A6 H6 M2、matlab不会对超过三维的数组进行加速。 % a$ j7 @: O$ t4 w' Y o7 \9 w3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值 4 y! r7 e7 Q' @, N来表示;. \- V0 V+ k" N6 W b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数8 R. E7 q! p' _& a p1 z 据类型,只使用 9 C8 ]( U* Z7 P6 k, g6 ^三维以下的数组;c、循环内只调用了内建函数(build-in function)。4 K) f/ g4 n3 g! ]# a& ^" G$ U 4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将 + a/ {: f! n) [1 I. I- @加速运行。. W" S) @5 I) y# l 5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:7 M- W5 N0 K% g( [& U; K x = a.name; for k=1:10000, sin(A(k)), end; $ {2 W1 J. V+ v) {( y6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速 " C! h3 ^% ?) W9 E度。* w) A& a- F8 l! ~7 J 7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低 3 p* g0 U8 ]5 Y) u6 I$ {运行速度。& \$ P; k& u0 l2 Z( C

7 U2 x1 u1 _5 P

二、 遵守三条规则 , @& a5 R+ ~7 p6 x4 y- H2 T* K* u, T6 Q' }! |( U$ X 1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic: E9 ?, X# Y V& A. s) O h means it is designed5 a6 h- G2 G5 G1 d- E4 d+ I! T7 f # N) [9 w. @5 }+ Z: R1 i0 r" N2 Kfor vector and matrix operations. You can often speed up your M-file c " l) a: Z; i4 ~9 S/ l& u' v/ Fode by using! U) I, g+ Z( L" x vectorizing algorithms that take advantage of this design. Vectorizati0 y* P2 q+ ~& U1 O" N! u on means converting 6 s& \6 E. S$ P$ S# qfor and while loops to equivalent vector or matrix operations.”。改进 5 D. f h+ S) Z这样的状况有两种方法: % F' D! T: b9 {& V/ K* e 4 a( P/ D, q( W( n( s4 s) Ba、尽量用向量化的运算来代替循环操作。如将下面的程序: 1 C8 H& w7 x$ I1 t- n' O5 O* K H& l7 v/ I i=0; 1 j" ?$ x8 m3 f1 ~3 Vfor t = 0:.01:10 3 i5 e9 q& [ `9 I4 O+ U# l+ `2 Bi = i+1;2 \' ~3 f2 T `5 N5 r y(i) = sin(t); 2 S& h3 T+ B* Yend. Q5 J3 C; K5 d2 @' q 替换为:8 [- c* o4 o0 K, Y t = 0:.01:10;! b. l M6 l! e3 ~ y = sin(t);2 g5 B0 Y( n( a 速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i- j& [; K8 C4 p: {. a( F) b permute、permute、- H* [* L2 X, T& m! i reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums ( T) Y8 n' ^) _& `+ Z2 mum、ind2sub、' s2 N" y4 Y: q% b1 z ndgrid、repmat、sort、sum 等。 * q# T" K3 R9 Z9 y ! v. M+ X; Q' z请注意matlan文档中还有这样一句补充:“Before taking the time to; V) b; R' C! S2 E' s) _! O3 Y2 c ' _+ u% {- Z1 s& `, P vectorize your code, read the section on Performance Acceleration. 5 W! o, h; o2 a, @& rYou may be able to# e' q/ S/ @1 C2 h, `9 r7 b speed up your program by just as much using the MATLAB JIT Accelera* {! E8 n7 j+ b! c. V tor instead of ! E% g* b. ~8 t0 ~* L: v' _ vvectorizing.”。何去何从,自己把握。( z& {% _) G- ?% o ( M" k/ U! d: S& g# k! t0 |b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执% O% p9 @$ }# v- Y3 S: z0 z 行循环次数少的, 5 c; S: q2 m8 o& ~0 H+ Z7 P+ L内环执行循环次数多的。这样可以显著提高速度。$ d3 |6 T/ w( ?0 ~3 {1 _ C/ J( n+ G( `, Q) y( O z' [6 R/ D2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on+ ?4 I J1 `7 L4 C es、cell、struct、5 r$ R8 |5 L( w% Y2 x repmat等。 3 z2 B; U, A1 m* Q) Sb、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:9 |' @- x3 G( M5 { v) O/ z& I : n) {* n5 C+ @/ \0 Q6 l+ S7 X0 l8 aA = int8(zeros(100)); 3 ?. r( F! c p$ _换成:2 m( @2 ]* \; O& S5 @1 \# @ A = repmat(int8(0), 100, 100); * x" \4 h) G/ ~' i5 t, g% y: Qc、当需要扩充一个变量的大小、维数时使用repmat函数。2 n: e" z- R. ` * l3 Q4 Y) b$ u* [1 E9 F3 U 3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。! @- [" W( Y8 x4 ^ b、使用Functions而不是Scripts 。 1 _4 ^2 a. P2 U3 o) |

8 ]' ~% y$ H) y S1 s( \: [! ]

三、 绝招 4 m* ^0 h) j# m" @ 3 E/ F- F# N( Y1 x$ Q你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。 $ x' k2 {" P. d1 g7 V: s1、改用更有效的算法: o/ i) a- X u1 o+ L6 T* @ 2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。 % A4 o1 |6 R( I; y& O+ h5 L: A 5 f y$ X6 h$ P: J! H+ t关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++! H- P! ^- m1 ~% F. B3 z4 m4 } 语言文件,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%

该用户从未签到

新人进步奖 发帖功臣

注意

* U8 m2 V& t" q( J3 e0 l

加速之前应该先测试' k, d% G# @; r$ t% @# d! z+ N$ ` 使用profiler可以获得程序各个部分的耗时2 C7 M" W" Q* ?3 ~; @' \ 如此就能高效的加速+ q s) O& y$ W

/ S0 w Z8 b7 j' A

因为有的时候导致速度变慢的原因是逻辑结构不合理, $ e8 C& }: H. F: W0 ^5 q4 [, y+ ?而不涉及程序技术

6 E P9 N5 u1 W9 G5 |: ~0 i4 Z1 a

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

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-5-26 04:17 , Processed in 0.447398 second(s), 91 queries .

回顶部