2014-04-04 89 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