假设我有以下数组:
A=[1 2
1 4
2 6
3 5
5 7
1 9
2 7];
MATLAB中最有效(最好是单行)的方法是自动获取一个矩阵,该矩阵保存第一列中每个唯一元素的第二列元素的平均值?上面A
的结果是:
B=[1 mean([2 4 9])
2 mean([6 7])
3 mean([5])
5 mean([7])];
提前致谢!
答案 0 :(得分:1)
unique
可以生成第一列,而配备mean
函数的强大accumarray
会计算第二列(nonzeros
会调用不存在的索引,例如{{4
1}}在这种情况下):
>> B = [unique(A(:,1)),nonzeros(accumarray(A(:,1),A(:,2),[],@mean))]
B =
1.0000 5.0000
2.0000 6.5000
3.0000 5.0000
5.0000 7.0000
正如dan-man的评论中所指出的,上述方法仅在第一列始终具有整数值时才起作用(我想我暗示了给定示例中的这种用例;道歉)。您可以使用unique
来解决以下缺点:
[Aunq,~,Aind] = unique(A(:,1));
B = [Aunq,accumarray(Aind,A(:,2),[],@mean))];
进一步指出,由于accumarray
内部的工作方式,直接调用mean
不如直接执行计算有效:
B = [Aunq,accumarray(Aind,A(:,2),[],@sum)./accumarray(Aind,1,[],@sum)]
答案 1 :(得分:0)
B=[];for k=unique(A(:,1)).';B=[B;k sum((A(:,1)==k).*A(:,2))/sum((A(:,1)==k))];end