假设我有矩阵A.第一列是“组”。然后我想计算每个组的第二列的平均值。所以,我想创建B.第二列小组的平均值,按第一列分组
A=
1 2
1 3
2 4
2 2
B=
1 2.5
2 3
我做了到现在为止最好的办法是建立一个长期的,如果回路,并使用平均函数获取B.
不过,我想会有更多的简单的方法。在那儿?
假设我有矩阵A.第一列是“组”。然后我想计算每个组的第二列的平均值。所以,我想创建B.第二列小组的平均值,按第一列分组
A=
1 2
1 3
2 4
2 2
B=
1 2.5
2 3
我做了到现在为止最好的办法是建立一个长期的,如果回路,并使用平均函数获取B.
不过,我想会有更多的简单的方法。在那儿?
我之前没有使用过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);
如果您只需要聚合一个数组,那么accumarray就是要走的路。如果您需要汇总数据矩阵的完整行,则可能需要签出[此线程](http://stackoverflow.com/questions/33635984/time-series-aggregation-efficiency)。我会在那里为我的mex函数提供一个无耻的插件:P当时我不知道有关准确数据,但我基本上是为矩阵写了准确数据。 –
@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
@mikkola非常感谢你! – user3123767
['accumarray'(HTTP: //www.mathworks.com/help/matlab/ref/accumarray.html) – Dan
@Dan Lol,我从来不知道有关准妈妈。我基本上为这种情况写了我自己的mex函数:P –