2012-05-30 210 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是的,聽起來不錯。 –