2015-11-24 103 views
0

假设我有矩阵A.第一列是“组”。然后我想计算每个组的第二列的平均值。所以,我想创建B.第二列小组的平均值,按第一列分组

A= 
1 2 
1 3 
2 4 
2 2 

B= 
1 2.5 
2 3 

我做了到现在为止最好的办法是建立一个长期的,如果回路,并使用平均函数获取B.

不过,我想会有更多的简单的方法。在那儿?

+5

['accumarray'(HTTP: //www.mathworks.com/help/matlab/ref/accumarray.html) – Dan

+0

@Dan Lol,我从来不知道有关准妈妈。我基本上为这种情况写了我自己的mex函数:P –

回答

2

我之前没有使用过accumarray,所以由于@Dan的评论,我决定尝试一下。

起初,我尝试了天真的版本,并使用histc计数事件以获得所需的平均值...(请注意,accumarray将输出排序顺序相同unique,这样的意思会被正确计算)

%// Naive version 
ua = unique(A(:,1)); %// use as histc bins (or sorted "group" values) 
result = accumarray(A(:,1), A(:,2)) ./ histc(A(:,1), uA); 

这里,accumarray通过对A(:,2)中的所有条目求和,对应于A(:,1)中的相同下标。

但后来我意识到,通过将可选fun参数accumarray变化的“总结”,以“中庸”,你可以做到这一点作为一个班轮:

%// one-liner 
result = accumarray(A(:,1), A(:,2), [], @mean); 
+0

如果您只需要聚合一个数组,那么accumarray就是要走的路。如果您需要汇总数据矩阵的完整行,则可能需要签出[此线程](http://stackoverflow.com/questions/33635984/time-series-aggregation-efficiency)。我会在那里为我的mex函数提供一个无耻的插件:P当时我不知道有关准确数据,但我基本上是为矩阵写了准确数据。 –

+0

@MatthewGunn一些更多的替代品:http://stackoverflow.com/questions/4350735/is-there-an-accumarray-that-takes-matrix-as-val和http://stackoverflow.com/questions/16086874/matlab -ind-and-apply-function-to-values-of-repeated-indices – Dan

+0

@mikkola非常感谢你! – user3123767

相关问题