声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

查看: 2332|回复: 9

[编程技巧] 求教编程提速去掉此for循环

[复制链接]
发表于 2011-5-16 21:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?我要加入

x

  1. %这是一个移位求平均值的程序
  2. length=1000; %信号的总长度
  3. rlength=100; %移动位置为100
  4. average= zeros(1000,1); %初始化
  5. for i=1:901                                %这个for循环有些占用时间看看看看高手有没有什么替代或是提速的方法
  6. average(i)=mean(signal(i:i+99));
  7. end
  8. average(902:1000)=average(901);
复制代码

回复
分享到:

使用道具 举报

发表于 2011-5-16 22:09 | 显示全部楼层
matlab自身有移动平均现成的命令
matlab搜索:Moving Average Filter
  1. a = 1;
  2. b = [1/4 1/4 1/4 1/4];
  3. y = filter(b,a,x);
复制代码

评分

1

查看全部评分

 楼主| 发表于 2011-5-16 22:24 | 显示全部楼层
本帖最后由 321forever 于 2011-5-16 22:33 编辑

回复 2 # hebut 的帖子

谢谢但是我想实现的功能好像和这个moving average filter有些区别,
  1. x=[1 2 3 4 5 6 7 8 9 10];
  2. a=1;
  3. b=[1/4 1/4 1/4 1/4];
  4. y=filter(b,a,x);
  5. % 结果是
  6. y =

  7. 0.2500 0.7500 1.5000 2.5000 3.5000 4.5000 5.5000 6.5000 7.5000 8.5000
复制代码
而按我的程序
  1. y=2.5 3.5 4.5 5.5 6.5 7.5 8.5 8.5 8.5 8.5
复制代码

发表于 2011-5-17 10:40 | 显示全部楼层
你的结果第一个值是前四个数相加平均,filter是前面补3个0,然后相加平均,所以你的结果比它的结果向前平移了四位。
也就是:
它的结果是:y(n)=1/4*(n-3)+1/4*(n-2)+1/4*(n-1)+1/4*(n)
你的结果是:y(n)=1/4*(n)+1/4*(n+1)+1/4*(n+2)+1/4*(n+3)
平移一下就可以了

评分

1

查看全部评分

发表于 2011-5-17 10:52 | 显示全部楼层
回复 1 # 321forever 的帖子
  1. %这是一个移位求平均值的程序
  2. clear;clc;
  3. length=1000; %信号的总长度
  4. rlength=100; %移动位置为100
  5. average= zeros(1000,1); %初始化
  6. aver = zeros(1000,1);
  7. ave = zeros(1000,1);
  8. signal = rand(1,1000);
  9. warning off
  10. %% 用循环
  11. tic;
  12. for i=1:901 %这个for循环有些占用时间看看看看高手有没有什么替代或是提速的方法
  13. average(i)=mean(signal(i:i+99));
  14. end
  15. average(902:1000)=average(901);
  16. toc;
  17. %% 用arrayfun
  18. tic
  19. aver(1:901) = arrayfun(@(x)mean(signal(x:x+99)),1:901);
  20. aver(902:end) = aver(901);
  21. toc
  22. % isequal(aver,average)
  23. %% 用hankel矩阵构造
  24. tic
  25. b = hankel(signal(1:100),[0,signal(101:end)]);
  26. ave(1:901) = mean(b);
  27. ave(902:end) = ave(901);
  28. toc
  29. isequal(aver,ave,average)
复制代码

运行结果:


  1. Elapsed time is 0.015726 seconds.
  2. Elapsed time is 0.022444 seconds.
  3. Elapsed time is 0.004636 seconds.

  4. ans =

  5. 1
复制代码


评分

1

查看全部评分

 楼主| 发表于 2011-5-17 15:09 | 显示全部楼层
回复 4 # hebut 的帖子

谢谢了啊,移位不错的方法,能帮忙再讲讲move average filter有什么作用么
 楼主| 发表于 2011-5-17 17:25 | 显示全部楼层
本帖最后由 321forever 于 2011-5-17 17:26 编辑

回复 5 # qibbxxt 的帖子

谢谢,我试了你给的hankel,对于30000以下的可以运行,但要是50000点的话,会提示
  1. c=[1:50000];
  2. d=hankel(c(1:1000),[0,c(1001:end)]);
  3. ?????Out of memory. Type HELP MEMORY for your options;
复制代码
想问下有没有什么解决办法,还是我的电脑内存的问题

点评

所谓向量化,就是用空间来换取时间,既然空间不够,那就没有办法了  发表于 2011-5-17 20:10
发表于 2011-5-17 19:19 | 显示全部楼层
回复 6 # 321forever 的帖子

我也是只用过移动平均这个功能,就是这个式子:y(n)=1/4*(n-3)+1/4*(n-2)+1/4*(n-1)+1/4*(n),其他的没看过,帮助里面应该有的吧
 楼主| 发表于 2011-5-17 19:29 | 显示全部楼层
回复 8 # hebut 的帖子

恩谢谢啊,那我就再看看
发表于 2012-4-26 20:27 | 显示全部楼层
进来看看,学习学习
您需要登录后才可以回帖 登录 | 我要加入

本版积分规则

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-11-2 23:21 , Processed in 0.061487 second(s), 18 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表