求教编程提速去掉此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);
matlab自身有移动平均现成的命令
matlab搜索:Moving Average Filtera = 1;
b = ;
y = filter(b,a,x); 本帖最后由 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
你的结果第一个值是前四个数相加平均,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 # 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
回复 4 # hebut 的帖子
谢谢了啊,移位不错的方法,能帮忙再讲讲move average filter有什么作用么 本帖最后由 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;想问下有没有什么解决办法,还是我的电脑内存的问题 回复 6 # 321forever 的帖子
我也是只用过移动平均这个功能,就是这个式子:y(n)=1/4*(n-3)+1/4*(n-2)+1/4*(n-1)+1/4*(n),其他的没看过,帮助里面应该有的吧 回复 8 # hebut 的帖子
恩谢谢啊,那我就再看看 进来看看,学习学习
页:
[1]