MATLAB计算矩阵中每列数对应的平均值?

时间:2016-05-01 10:33:52

标签: arrays matlab

假设我有以下数组:

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])];

提前致谢!

2 个答案:

答案 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