2012-05-30 177 views
2

假设我有载体:Matlab的:“分组平均”

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

是否有一个量化的方式来获得一个“分组平均”,也就是yc每个唯一值的平均值? (这是一个简单的例子;我有类似的东西,但矢量大小是在成千上万,有数百个值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 

回答

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'),它将第二个输入向量的行分组。元素需要是正整数(出于某种原因),这就是为什么我添加了1到c'。最后一个输入是一个函数句柄,该函数作为累加器应用于y中的每组值。

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

+0

很酷!谢谢!看起来我也可以使用从'unique'返回的索引作为准确数据的第一个参数(例如,如果我的唯一值不是连续的整数) –

+0

@JasonS:或使用统计工具箱中的'grp2idx' – Jonas

+0

@JasonS是的,听起来不错。 –