2015-11-24 101 views
0

假設我有矩陣A.第一列是「組」。然後我想計算每個組的第二列的平均值。所以,我想創建B.第二列小組的平均值,按第一列分組

A= 
1 2 
1 3 
2 4 
2 2 

B= 
1 2.5 
2 3 

我做了到現在爲止最好的辦法是建立一個長期的,如果迴路,並使用平均函數獲取B.

不過,我想會有更多的簡單的方法。在那兒?

+5

['accumarray'(HTTP: //www.mathworks.com/help/matlab/ref/accumarray.html) – Dan

+0

@Dan Lol,我從來不知道有關準媽媽。我基本上爲這種情況寫了我自己的mex函數:P –

回答

2

我之前沒有使用過accumarray,所以由於@Dan的評論,我決定嘗試一下。

起初,我嘗試了天真的版本,並使用histc計數事件以獲得所需的平均值...(請注意,accumarray將輸出排序順序相同unique,這樣的意思會被正確計算)

%// Naive version 
ua = unique(A(:,1)); %// use as histc bins (or sorted "group" values) 
result = accumarray(A(:,1), A(:,2)) ./ histc(A(:,1), uA); 

這裏,accumarray通過對A(:,2)中的所有條目求和,對應於A(:,1)中的相同下標。

但後來我意識到,通過將可選fun參數accumarray變化的「總結」,以「中庸」,你可以做到這一點作爲一個班輪:

%// one-liner 
result = accumarray(A(:,1), A(:,2), [], @mean); 
+0

如果您只需要聚合一個數組,那麼accumarray就是要走的路。如果您需要彙總數據矩陣的完整行,則可能需要簽出[此線程](http://stackoverflow.com/questions/33635984/time-series-aggregation-efficiency)。我會在那裏爲我的mex函數提供一個無恥的插件:P當時我不知道有關準確數據,但我基本上是爲矩陣寫了準確數據。 –

+0

@MatthewGunn一些更多的替代品:http://stackoverflow.com/questions/4350735/is-there-an-accumarray-that-takes-matrix-as-val和http://stackoverflow.com/questions/16086874/matlab -ind-and-apply-function-to-values-of-repeated-indices – Dan

+0

@mikkola非常感謝你! – user3123767

相關問題