嗨我在MATLAB中有这样的数据:
F =
1.0000 1.0000
2.0000 1.0000
3.0000 1.0000
3.1416 9.0000
4.0000 1.0000
5.0000 1.0000
6.0000 1.0000
6.2832 9.0000
7.0000 1.0000
8.0000 1.0000
9.0000 1.0000
9.4248 9.0000
10.0000 1.0000
我正在寻找一种在特定时间间隔内对数据求和的方法。例如,如果我希望我的采样间隔为1,则最终结果应为:
F =
1.0000 1.0000
2.0000 1.0000
3.0000 10.0000
4.0000 1.0000
5.0000 1.0000
6.0000 10.0000
7.0000 1.0000
8.0000 1.0000
9.0000 10.0000
10.0000 1.0000
,即基于对第一行的采样,在第二列中累积数据。在MATLAB中有一个函数可以做到这一点吗?
答案 0 :(得分:3)
是的,这是accumarray的工作:
使用F
第1列中的值对第2列中的元素求和(accumarray
的默认行为)。
对于给定的大小s
的间隔(感谢Luis Mendo):
S = accumarray(round(F(:,1)/s),F(:,2),[]); %// or you can use "floor" instead of "round".
S =
1
1
10
1
1
10
1
1
10
1
所以通过连接构造输出:
NewF = [unique(round(F(:,1)/s)) S]
NewF =
1 1
2 1
3 10
4 1
5 1
6 10
7 1
8 1
9 10
10 1
耶!!
答案 1 :(得分:3)
是histc()
和accumarray()
合并:
F =[1.0000 1.0000;...
2.0000 1.0000;...
3.0000 1.0000;...
3.1416 9.0000;...
4.0000 1.0000;...
5.0000 1.0000;...
6.0000 1.0000;...
6.2832 9.0000;...
7.0000 1.0000;...
8.0000 1.0000;...
9.0000 1.0000;...
9.4248 9.0000;...
10.0000 1.0000];
range=1:0.5:10;
[~,bin]=histc(F(:,1),range);
result= [range.' accumarray(bin,F(:,2),[])]
如果您运行代码,请记住我将采样间隔(range
)更改为0.5。
此代码适用于所有采样间隔,只需将您想要的间隔定义为range
。