Imatlab效率提升独孤九剑附fft优化的详细例子.docVIP

Imatlab效率提升独孤九剑附fft优化的详细例子.doc

  1. 1、本文档共11页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Imatlab效率提升独孤九剑附fft优化的详细例子

matlab效率提升独孤九剑 作者:信科@滨 matlab效率提升葵花宝典 1 一. 引言 2 二. 优化措施 2 三. 调试和性能分析工具 5 附录:自编fft函数的优化详解 6 参考资料: 11 一. 引言 要提升程序的效率,无非在两个方面:天生的和后天的。 第一个方面是算法本身的复杂度。比如插入排序复杂度为O(N2),而快速排序算法是O(NlnN),当然在大数据量时快速排序就比插入排序快很多了,这就是算法天生的优越性。所以世界并不是决定公平的啊,有的人就可以成为快速排序,而其他人只能成为插入排序,呵呵。 第二个方面是算法具体实现的问题。实现算法的方式不同,写程序的人不同,使用的语言不同,优化方式的不同,是否多线程,是否并行,都会使得同一算法的不同实现时间相差十倍以上,我们称之为后天的。所以当起跑线差不多时,就看谁更拼命了,所以最终有人就是冠军而有的就只能千年老二。这也是造成社会不公平的原因。 有时候就算有的高手实现插入排序都比菜鸟写的快速排序快上不少,我们可以称之为“屌丝的逆袭”,屌丝不遗憾,就看有没有一颗拼搏的心了。 而这篇文章详细介绍第二方面的算法具体实现的效率问题。这是我这三年来编写matlab程序的一些经验和教训的总结,外加网上各路人马的观点,由于写测试例子太费时费力,不重要的就不写了。 二. 优化措施 我们先看看matlab2007之前传统的一些优化观点: 观点 传统 现代 向量化编程,避免使用循环 YES NO 多使用MATLAB的内置函数能用逻辑索引解决的就不用数值索引尽量不用Cel型数组矩阵含有大量0元素, 采用稀疏矩阵 N0 YES 列向量存储 YES YES 对向量化:由于matlab2007之后的JIT和加速器技术,使得for和向量化的差别不明显了。注意向量化可能会占用大量的内存,有时候for循环更好读。 逻辑索引:采用逻辑索引比数值索引(find)快30%左右。 cell:我一般用结构体代替,但是有时候用cell更方便,需要看情况而定,可能cell更方便,直观,程序可读性更好。一般瓶颈也不在这儿值得商榷。 预分配:比如后面的循环要用到一个1000的数组,先预分配x=zeros(1,1000); 稀疏矩阵:稀疏矩阵一般有专门的稀疏算法,可能效率更高,更省内存。由于平时没怎么用过,不发表意见。 刚才看到一个减少变量赋值的次数的技术: inplace operation: 就是如果输入参数要返回的话,就让输出参数和输入参数同名,减少赋值次数。 举个例子: function y=f1(x) y=x+1; end 我们可以改写成 function x=f2(x) x=x+1; end 经过测试发现f2比f1快了110%,很是明显。 使用mex文件:用其他语言来实现需要的功能,避开matlab的瓶颈。 用乘法代替除法进行向量运算: b=a/1.5;改成b=a*(1/1.5);经过测试速度快了三倍!神奇啊!这也是我无意之中发现的,看来乘法跟除法还是差别大啊。 尽量用列向量进行操作: 因为matlab的矩阵是按列存放的,对其进行存取的速度比行的方式要快20%。 三. 调试和性能分析工具 调试和性能分析工具: 断点的熟练运用,便于找到程序的错误和疏忽的地方。 用profiler进行性能分析,找出性能瓶颈,其实很多时候上面提到的注意事项并不是最花时间的,有时候就一两句话就花了差不多80%的时间,注意2/8原则。 附录:自编fft函数的优化详解 下面我以这两天我写的fft快速傅里叶变换作为上述优化方法的应用。我是参考北京大学张平文写的《数值分析》中的算法来实现的。 x=FFT(x,cnt),这儿就无意之中用到了inplace operation技术,呵呵。 大概流程: 重新排列x的顺序 预先计算wnk的值,以备后用 迭代进行计算 分析:fft也可以采用递归的方式进行求解,但是速度跟迭代的方式没法比,而且内存占用高。 第一步:重新排列x的顺序的具体实现 function [order]=fftorder(cnt,n) %得到次序 order=zeros(1,cnt); order(1:2)=[1,cnt/2+1]; i_2=cnt/2; num=1; for i=1:n-1 num=num*2; i_2=i_2/2; order(num+1:num*2)=order(1:num)+i_2; end end 评注:此处我用了预分配技术,向量化操作。这个没啥好说的,而且时间也不是花在这儿。不过我感觉我的这种实现方法很是精妙,哈哈。 第二步:计算wnk 版本1. function w=wn(n,cnt) w=ones(cnt/2,n); i_2=1;

文档评论(0)

wangz118 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档