分享
 
 
 

加速matlab运行的三重境界

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

发信人: fork (撒哈拉沙漠的沙), 信区: Matlab

标 题: 加速matlab运行的三重境界

发信站: BBS 哈工大紫丁香站 (Tue Jul 6 13:34:36 2004)

加速matlab运行的三重境界

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%

一、 遵守Performance Acceleration的规则

二、 遵守三条规则

三、 绝招

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%

一、 遵守Performance Acceleration的规则

关于什么是“Performance Acceleration”请参阅matlab的帮助文件。我只简要的将

其规则总结如下7条:

1、只有使用以下数据类型,matlab才会对其加速:

logical,char,int8,uint8,int16,uint16,int32,uint32,double

而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structu

re,single,

function handle,java classes,user classes,int64,uint64

2、matlab不会对超过三维的数组进行加速。

3、当使用for循环时,只有遵守以下规则才会被加速:a、for循环的范围只用标量值

来表示;

b、for循环内部的每一条语句都要满足上面的两条规则,即只使用支持加速的数

据类型,只使用

三维以下的数组;c、循环内只调用了内建函数(build-in function)。

4、当使用if、elseif、while和switch时,其条件测试语句中只使用了标量值时,将

加速运行。

5、不要在一行中写入多条操作,这样会减慢运行速度。即不要有这样的语句:

x = a.name; for k=1:10000, sin(A(k)), end;

6、当某条操作改变了原来变量的数据类型或形状(大小,维数)时将会减慢运行速

度。

7、应该这样使用复常量x = 7 + 2i,而不应该这样使用:x = 7 + 2*i,后者会降低

运行速度。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%

二、 遵守三条规则

1、尽量避免使用循环,MATLAB的文档中写到“MATLAB is a matrix language, whic

h means it is designed

for vector and matrix operations. You can often speed up your M-file c

ode by using

vectorizing algorithms that take advantage of this design. Vectorizati

on means converting

for and while loops to equivalent vector or matrix operations.”。改进

这样的状况有两种方法:

a、尽量用向量化的运算来代替循环操作。如将下面的程序:

for t = 0:.01:10

i = i+1;

y(i) = sin(t);

end

替换为:

t = 0:.01:10;

y = sin(t);

速度将会大大加快。最常用的使用vectorizing技术的函数有:All、diff、i

permute、permute、

reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cums

um、ind2sub、

ndgrid、repmat、sort、sum 等。

请注意matlan文档中还有这样一句补充:“Before taking the time to

vectorize your code, read the section on Performance Acceleration.

You may be able to

speed up your program by just as much using the MATLAB JIT Accelera

tor instead of

vectorizing.”。何去何从,自己把握。

b、在必须使用多重循环时下,如果两个循环执行的次数不同,则在循环的外环执

行循环次数少的,

内环执行循环次数多的。这样可以显著提高速度。

2、a、预分配矩阵空间,即事先确定变量的大小,维数。这一类的函数有zeros、on

es、cell、struct、

repmat等。

b、当要预分配一个非double型变量时使用repmat函数以加速,如将以下代码:

A = int8(zeros(100));

换成:

A = repmat(int8(0), 100, 100);

c、当需要扩充一个变量的大小、维数时使用repmat函数。

3、a、优先使用matlab内建函数,将耗时的循环编写进MEX-File中以获得加速。

b、使用Functions而不是Scripts 。

c、使用Load、Save函数而不是File I/O Functions 。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

%%%%%%%%%%%%%%%%%%%%%%%

三、 绝招

你也许觉得下面两条是屁话,但有时候它真的是解决问题的最好方法。

1、改用更有效的算法

2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。

关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++

语言文件,VC编译”。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有