假设我有矢量:
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
答案 0 :(得分: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'
和y'
)对第二个输入向量的行进行分组。元素需要是正整数(由于某种原因),这就是我为c'
添加1的原因。最后一个输入是函数的句柄,该函数作为累加器应用于y中的每组值。
希望有道理!如果没有,doc accumarray
:)