• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

提高matlab运行速度 - 不如归去

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

提高matlab运行速度

我一开始写了好几个for循环,从不同的Excel文件中调用数据。后来用MATLAB自带的“运行并计时”功能,找到了毒瘤的代码是读取Excel中的数据,此操作占用了我将近80%的时间。然后我优化了一下,尽量减少读取Excel的次数,代码跑的时间立刻就下来了

 

一、 遵守Performance Acceleration的规则
二、 遵守三条规则
三、 绝招

一、 遵守Performance Acceleration的规则

1、只有使用以下数据类型,matlab才会对其加速: logical,char,int8,uint8,int16,uint16,int32,uint32,double
而语句中如果使用了非以上的数据类型则不会加速,如:numeric,cell,structre,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、尽量避免使用循环
a、尽量用向量化的运算来代替循环操作。最常用的使用vectorizing技术的函数有:All、diff、ipermute、permute、reshape、squeeze、any、find、logical、prod、shiftdim、sub2ind、cumsum、ind2sub、ndgrid、repmat、sort、sum 等。
请注意matlab文档中还有这样一句补充:“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、ones、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 。

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

1、改用更有效的算法

2、采用Mex技术,或者利用matlab提供的工具将程序转化为C语言、Fortran语言。
关于如何将M文件转化为C语言程序运行,可以参阅本版帖子:“总结:m文件转化为c/c++语言文件,VC编译”。

 

 

一、未进行内存预分配

y = 0;

tic;

for i=2:100000;

     y(i+1) = y(i)+ randn;

end;

toc

时间已过 0.031222 秒。

 

二、进行内存预分配

y = zeros(100001,1);

tic;

  for i=2:100000;

      y(i+1) = y(i)+ randn;

  end;

toc

时间已过 0.007672 秒。

节约时间=(0.031222-0.007672 )/ 0.031222 =75%

 

三、进行矩阵计算

y = zeros(100001,1);

tic;

y= cumsum([0;y]);

toc

时间已过 0.000445秒。

节约时间=(0.031222-0.000445 )/ 0.031222 =98.6%

 

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Delphi中的Sender:TObject对象解析发布时间:2022-07-18
下一篇:
Delphi函数的返回值(注意这里与C/C++等语言有差异)发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap