首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MATLAB:从非均匀网格到均匀网格的平均数据

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

Stack Overflow用户
提问于 2014-09-11 17:23:19
回答 2查看 742关注 0票数 2

我每隔10分钟采集数据,但是有很多数据缺口,我想把它平均在一个统一的每小时的时间网格上。我正在寻找一种有效的方法,把每小时的任何一边的三个潜在点,并将他们平均到一个小时。

示例:

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编辑:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2014-09-11 18:39:07

方法#1

代码语言:javascript
复制
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

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-09-12 10:29:39

在您询问了有关histc方法的评论之后,我在这里发布它。虽然这是而不是最快的方法--如果这是您希望对数据所做的全部工作--但是在以后需要重用bin信息(数据分类)时,它可能很有用。

以下代码:

代码语言:javascript
复制
%% // 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

产生以下输出:

代码语言:javascript
复制
Elapsed time is 3.177801 seconds.
Elapsed time is 2.910844 seconds.
Elapsed time is 2.948526 seconds.

我用不同的循环迭代次数多次运行它,结果总是一致的。优化的初始方法总是比组蛋白法快。我并不是组方法的忠实拥趸,因为在我们已经绑定了所有数据之后,它仍然涉及一个循环和比较(data(bins==iBin)),而不是直接索引。

不过,两者的比较略有不同。一种是>类型的,操作在浮点数上,另一种是=和比较索引(理论上是整数,但我不确定Matlab如何在内部表示它们,所以可能没有好处)。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25793556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档