MATLAB:从非均匀网格到均匀网格的平均数据

时间:2014-09-11 17:23:19

标签: matlab moving-average binning

我每隔10分钟获取一次数据,但是有很多数据空白,我想将它平均到一个统一的每小时时间网格。我正在寻找一种有效的方法来获取每小时两侧的3个潜在点并将它们平均到小时。

示例:

t_old = [1:35 1:45 1:55 - 2:15 2:25]% - 缺少数据

t_new = 2:00

data_old = [1 2 3 - 5 6]

data_new = 3.4

问题是有足够的数据缺口,我不能只是直接平均值。我知道我可以通过转到每个新的时间步骤并使用带有半小时偏移的find()来做到这一点,但我觉得这样效率非常低效且缓慢。有什么想法更快地做到这一点?也许某种方式可以装到最近的小时,然后是平均箱子?

编辑MWE:

t=1:10; 
tnew=2:2:8;
data=1:10; 
t(3)=[];
data(3)=[];
dt=2; 
for i=1:length(tnew)
    datanew(i)=mean(data(find(t>(tnew(i)-dt) & t<(tnew(i)+dt)))); 
end

datanew

2 个答案:

答案 0 :(得分:1)

方法#1

tnew_lb = tnew-dt; %// lower bound
tnew_ub = tnew+dt; %// upper bound
[r,c] = find(bsxfun(@gt,t',tnew_lb) & bsxfun(@lt,t',tnew_ub));
datanew = accumarray(c,data(r),[], @mean)

方法#2

timestep = min(diff(t)); %// Minimum time-stepsize for t
t_all = min(t):timestep:max(t); %// create all the timesteps
[b1,b2] = ismember(t,t_all);

ind = bsxfun(@plus,[tnew(1)-dt+1:tnew(1)+dt-1]',[0:numel(tnew)-1]*dt);
[v1,v2] = ismember(ind,t_all(b2));
vind = v2~=0;
v2(v2==0) = NaN;
v2(vind) = data(v2(vind));
out = nanmean(v2);

答案 1 :(得分:1)

在您发表有关histc方法的评论后,我将其发布在此处。虽然这是最快的方法,如果您只想对数据进行操作,那么以后需要重用bin信息(数据分类)时可能会有用。

以下代码:

%% // prepare
clear all
t=1:10; 
tnew=2:2:8;
data=1:10; 
t(3)=[];
data(3)=[];
nLoop = 50000 ;

%% // initial method
tic ;
for iLoop = 1:nLoop
    clear datanew
    dt=1; 
    for i=1:length(tnew)
        datanew(i)=mean( data( find(t>=(tnew(i)-dt) & t<(tnew(i)+dt)) )); 
    end
end
toc

%% // initial method optimized
tic ;
for iLoop = 1:nLoop
    clear datanew
    dt=1; 
    datanew = zeros( size(tnew) ) ;
    for i=1:length(tnew)
        datanew(i)=mean( data( t>=(tnew(i)-dt) & t<(tnew(i)+dt) )); 
    end

end
toc

%% // histc method
xedges = [tnew(1)-dt tnew+dt] ; %// => xedges = [1:2:9] ;
tic
for iLoop = 1:nLoop
    clear newdata
    newdata = zeros( size(tnew)) ;
    [n,bins] = histc( data , xedges ) ;
    for iBin=1:length(n)-1
        newdata(iBin) = mean( data(bins==iBin) ); 
    end
end
toc

产生以下输出:

Elapsed time is 3.177801 seconds.
Elapsed time is 2.910844 seconds.
Elapsed time is 2.948526 seconds.

我使用不同的循环迭代次数多次运行它,结果总是一致的。 优化初始方法总是比 histc 方法更快。我不是histc方法的忠实粉丝,因为在我们已经将所有数据分箱后,它仍然涉及循环和比较(data(bins==iBin))而不是直接索引。

但比较略有不同。一个是>类型,对浮点数进行操作,而另一个是=并比较索引(理论上是整数但我不确定Matlab如何在内部表示它们,所以它可能不是一个好处)。

无论如何,这可能会导致执行时间与我使用更大更复杂的数据集获得的时间不同,因此欢迎您在真实数据上尝试使用这些方法,并随时告诉我们它是如何工作的。


ps:我略微修改了您的初始示例,因此平均时间窗口(已更改dt=1和一个>更改为>=)不再有重叠。这样,所有方法都会返回相同的结果。