321forever 发表于 2011-5-16 21:25

求教编程提速去掉此for循环


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

hebut 发表于 2011-5-16 22:09

matlab自身有移动平均现成的命令
matlab搜索:Moving Average Filtera = 1;
b = ;
y = filter(b,a,x);

321forever 发表于 2011-5-16 22:24

本帖最后由 321forever 于 2011-5-16 22:33 编辑

回复 2 # hebut 的帖子

谢谢但是我想实现的功能好像和这个moving average filter有些区别,x=;
a=1;
b=;
y=filter(b,a,x);
% 结果是
y =

0.2500 0.7500 1.5000 2.5000 3.5000 4.5000 5.5000 6.5000 7.5000 8.5000
而按我的程序
y=2.5 3.5 4.5 5.5 6.5 7.5 8.5 8.5 8.5 8.5

hebut 发表于 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)
平移一下就可以了

qibbxxt 发表于 2011-5-17 10:52

回复 1 # 321forever 的帖子

%这是一个移位求平均值的程序
clear;clc;
length=1000; %信号的总长度
rlength=100; %移动位置为100
average= zeros(1000,1); %初始化
aver = zeros(1000,1);
ave = zeros(1000,1);
signal = rand(1,1000);
warning off
%% 用循环
tic;
for i=1:901 %这个for循环有些占用时间看看看看高手有没有什么替代或是提速的方法
average(i)=mean(signal(i:i+99));
end
average(902:1000)=average(901);
toc;
%% 用arrayfun
tic
aver(1:901) = arrayfun(@(x)mean(signal(x:x+99)),1:901);
aver(902:end) = aver(901);
toc
% isequal(aver,average)
%% 用hankel矩阵构造
tic
b = hankel(signal(1:100),);
ave(1:901) = mean(b);
ave(902:end) = ave(901);
toc
isequal(aver,ave,average)
运行结果:


Elapsed time is 0.015726 seconds.
Elapsed time is 0.022444 seconds.
Elapsed time is 0.004636 seconds.

ans =

1

321forever 发表于 2011-5-17 15:09

回复 4 # hebut 的帖子

谢谢了啊,移位不错的方法,能帮忙再讲讲move average filter有什么作用么

321forever 发表于 2011-5-17 17:25

本帖最后由 321forever 于 2011-5-17 17:26 编辑

回复 5 # qibbxxt 的帖子

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

hebut 发表于 2011-5-17 19:19

回复 6 # 321forever 的帖子

我也是只用过移动平均这个功能,就是这个式子:y(n)=1/4*(n-3)+1/4*(n-2)+1/4*(n-1)+1/4*(n),其他的没看过,帮助里面应该有的吧

321forever 发表于 2011-5-17 19:29

回复 8 # hebut 的帖子

恩谢谢啊,那我就再看看

西门牛 发表于 2012-4-26 20:27

进来看看,学习学习
页: [1]
查看完整版本: 求教编程提速去掉此for循环