2014-04-04 138 views
1

我想在矩陣列中選擇數值的平均值,並通過它們在不同列中的值進行選擇。查找矩陣內的數值組的平均值

例如:

X=[1950  1; 
    1950  2; 
    1950  3; 
    1951  1; 
    1951  5; 
    1952  1] 

我想利用每每年值的平均值 - 本質上,具有相同的第1列的值中選擇值,然後採取相應的第2點的值的平均值。因此,1950的平均值將是21951的平均值將是1。我可以通過爲每個年份值創建一個矢量然後採用整個矢量的平均值來手動執行此操作,但這對於更大數量的數據不切實際。每年的數據點數有所不同,所以我不認爲我可以使用重塑來做到這一點。

+0

另請參見此[類似問題](http://stackoverflow.com/questions/19882413/how-to-deal-with-paired-values)和[加權平均值](http:// stackoverflow)上的相關問題的.com /問題/ 22792020/MATLAB的accumarray加權均值/ 22794702)。 – chappjc

回答

1

試試這個:

X=[1950 1; 1950 2; 1950 3; 1951 1; 1951 5; 1952 1]; 

years = unique(X(:,1)); 

for ii=1:length(years) 
    yr_index = find(X == years(ii)); 
    yr_avg(ii) = mean(X(yr_index,2)); 
end 

這會發現所有的特殊的一年條目。然後,它會逐步遍歷每年,找到與特定年份相對應的行,並將這些行的第二列作爲平均值。它將保存yr_avg向量中的均值。每年在yr_avg向量中輸入的年份向量應該具有相應的平均值。

+0

謝謝!這工作,我感謝你的明確解釋。我不得不添加一個預先分配的零數組,使用noy = numel(unique(y)); yr_avg =零(noy,1);然後一切正常! – user3498384

6

你想accumarray

[~, ~, ii ] = unique(X(:,1)); 
result = accumarray(ii, X(:,2), [], @mean); 

我建議你仔細閱讀documentation of accumarray,看看它是如何工作。這是一個非常強大和靈活的功能。

+0

謝謝,我從來沒有聽說過。我會研究這個功能以備將來使用。 – user3498384

+0

@ user3498384同意這是解決問題的正確方法。 +1使用'unique',你甚至可以在非數字類上操作。順便說一句,你也可以通過創建一個自定義函數來做一個[加權平均值](http://stackoverflow.com/a/22794702/2778484)。 – chappjc