第2列的子组平均值,按第1列分组

时间:2015-11-24 06:35:48

标签: matlab data-manipulation

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

A=
 1  2
 1  3
 2  4
 2  2

B=
 1  2.5
 2  3

我到目前为止做的最好的事情是构造一个long for和if循环并使用average函数来到B。

但我想会有更简单的方法。有吗?

1 个答案:

答案 0 :(得分: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来改变"求和" to"意思是",你可以做一个单行:

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