【问题标题】:Finding mean of groups of values within a matrix查找矩阵中值组的平均值
【发布时间】:2014-05-16 23:33:11
【问题描述】:

我正在尝试取矩阵列中选择值的平均值,并通过它们在不同列中的值来选择它们。

例如:

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

我想取每年值的平均值 - 本质上,选择具有相同第 1 列值的值,然后取对应第 2 列值的平均值。所以1950 的平均值为21951 的平均值为1。我可以通过为每年的值创建一个向量然后取整个向量的平均值来手动执行此操作,但这对于大量数据是不切实际的。每年的数据点数量各不相同,所以我认为我不能使用 reshape 来做到这一点。

【问题讨论】:

标签: matlab matrix indexing mean


【解决方案1】:

你想要accumarray:

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

我建议您彻底阅读documentation of accumarray 以了解其工作原理。这是一个非常强大和灵活的功能。

【讨论】:

  • 谢谢,我从没听说过。我将研究该功能以备将来使用。
  • @user3498384 同意这是解决您的问题的正确方法。 +1 使用unique,您甚至可以对非数字类进行操作。顺便说一句,您还可以通过创建自定义函数来执行weighted mean
【解决方案2】:

试试这个:

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 向量中。 years 向量中的每个年份条目都应在 yr_avg 向量中具有相应的平均值。

【讨论】:

  • 谢谢!这很有效,我很欣赏你的清晰解释。我必须添加一个预先分配的零数组,使用 noy=numel(unique(y)); yr_avg=zeros(noy,1);然后一切正常!
猜你喜欢
  • 2013-09-29
  • 2018-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
相关资源
最近更新 更多