如何在没有循环的情况下对数组中所有元素的唯一实例进行操作?

时间:2016-09-08 09:51:27

标签: matlab matrix vectorization

假设我有一个矩阵A,其第一列包含项目ID,第二列包含其权重。

3   2
2   1
2   4
1   7
3   4
2   5
1   2
4   3
2   5
3   6

我想找到每件商品的平均重量。所以,以下是我想要的输出:

1   4.5
2   3.75
3   4
4   3

我要编写的代码如下:

items = unique(A(:,1));
for i=1:size(A,1)
    temp=A(A(:,1)==items(i,1),:);
    items(i,2)=mean(temp(:,2));
end

此处,items是必需的输出。但是,随着每个项目的实例数量的增加以及数据集大小的增加,此代码在速度方面表现不佳,因为它必须首先收集所有唯一项目的实例,然后计算平均权重。

有没有办法在不必再次遍历数据集的情况下再次收集每个唯一项目的所有实例?

1 个答案:

答案 0 :(得分:4)

那是accumarray。适用于:

out = accumarray(A(:,1),A(:,2),[],@mean)
out =

    4.5000
    3.7500
    4.0000
    3.0000

这个简短的解决方案要求ID为整数,如果不是这样,您可以使用unique更通用的方法:

[~,~,subs] = unique(A(:,1))
vals = A(:,2);
out = accumarray(subs(:),vals(:),[],@mean)