假設我有矩陣A.第一列是「組」。然後我想計算每個組的第二列的平均值。所以,我想創建B.第二列小組的平均值,按第一列分組
A=
1 2
1 3
2 4
2 2
B=
1 2.5
2 3
我做了到現在爲止最好的辦法是建立一個長期的,如果迴路,並使用平均函數獲取B.
不過,我想會有更多的簡單的方法。在那兒?
假設我有矩陣A.第一列是「組」。然後我想計算每個組的第二列的平均值。所以,我想創建B.第二列小組的平均值,按第一列分組
A=
1 2
1 3
2 4
2 2
B=
1 2.5
2 3
我做了到現在爲止最好的辦法是建立一個長期的,如果迴路,並使用平均函數獲取B.
不過,我想會有更多的簡單的方法。在那兒?
我之前沒有使用過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);
如果您只需要聚合一個數組,那麼accumarray就是要走的路。如果您需要彙總數據矩陣的完整行,則可能需要簽出[此線程](http://stackoverflow.com/questions/33635984/time-series-aggregation-efficiency)。我會在那裏爲我的mex函數提供一個無恥的插件:P當時我不知道有關準確數據,但我基本上是爲矩陣寫了準確數據。 –
@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
@mikkola非常感謝你! – user3123767
['accumarray'(HTTP: //www.mathworks.com/help/matlab/ref/accumarray.html) – Dan
@Dan Lol,我從來不知道有關準媽媽。我基本上爲這種情況寫了我自己的mex函數:P –