假设我有矩阵A.第一列是“组”。然后我想计算每组的第二列的平均值。所以我想创建B。
A=
1 2
1 3
2 4
2 2
B=
1 2.5
2 3
我到目前为止做的最好的事情是构造一个long for和if循环并使用average函数来到B。
但我想会有更简单的方法。有吗?
答案 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);