2

假设我有向量:

 y = [1 1.01 1.02 1.03 2 2.01 2.02 3 3.01 3.02 3.03];
 c = [0 0    0    0    1 1    1    2 2    2    2   ];

是否有一种矢量化方法来获得“分组平均值”,即y每个唯一值的平均值c?(这是一个简化的示例;我有类似的东西,但向量大小为数千,并且 c 有数百个值)

我可以在 for 循环中做到这一点,只是想知道它是否可以被矢量化。这是我的for循环实现:

function [my,mc] = groupmean(y,c)
my = [];
mc = [];
for ci = unique(c)'
    mc(end+1) = ci;
    my(end+1) = mean(y(c==ci));
end
4

1 回答 1

6

简短的回答:

>> y = [1 1.01 1.02 1.03 2 2.01 2.02 3 3.01 3.02 3.03];
>> c = [0 0    0    0    1 1    1    2 2    2    2   ];
>> groupmeans = accumarray(c'+1,y',[],@mean)
groupmeans =
        1.015
         2.01
        3.015

解释上述内容:accumarray有点神秘,但非常有用且值得了解(而且速度非常快)。第一个输入是一个向量(它们必须是列向量,这就是为什么它是c'and y'),它对第二个输入向量的行进行分组。元素必须是正整数(出于某种原因),这就是我将 1 添加到c'. 最后一个输入是函数的句柄,该函数作为累加器应用于 y 中的每组值。

希望这是有道理的!如果没有,doc accumarray:)

于 2012-05-30T13:43:51.710 回答