【问题标题】:how to find mean of specific values based on values of other columns如何根据其他列的值查找特定值的平均值
【发布时间】:2026-01-15 06:35:01
【问题描述】:

我有一个像下面这样的矩阵。

2   1   0.020000000
2   1   0.020000000
2   1   0.020000000
2   1   0.020000000
2   2   0.434776340
2   2   0.392582120
2   2   0.549031660
2   3   0.0306320700000000
2   3   0.0336107500000000
3   1   0.0200000000000000
3   1   0.0200000000000000
3   1   0.0200000000000000
3   1   0.0200000000000000
3   1   0.0200000000000000
3   2   0.301534290000000
3   2   0.381151280000000
3   2   0.227146390000000
3   2   0.402937460000000
3   3   0.0773929900000000
3   3   0.0220243800000000
3   3   0.0859914800000000

我想检查第一列的值是否为 2,然后检查下一列,如果其值为 1,则计算 column3 中所有值的平均值,如下所示:

第 3 列值的平均值并将其放入不同的矩阵中。

    2   1   0.020000000
    2   1   0.020000000
    2   1   0.020000000
    2   1   0.020000000

然后对 2 2、2 3、3 1 等尝试此过程。

第二列的值为 1,2 或 3,但第一列的值在 2-5000 范围内。 我试过这样但它不能正常工作:

 [ii,jj]=find((S(:,2)==1)); //S is the matrix i mentioned earlier
      out=S(ii,[1,3]);
      for i=2:3
          if out(:,1)==i
              Mean(i) = mean (out(i,2));
          end
      end

谢谢!

【问题讨论】:

  • 是的,它们是,但是在 column1 prolly 中,我们没有从 1 到 5000 的所有值。

标签: matlab matrix


【解决方案1】:

使用uniqueaccumarray函数:

[unique_vals, ~, idx3]=unique(a(:,[1 2]),'rows'); % find unique combinations
means = accumarray(idx3, a(:,3),[],@mean); % find means
result = [unique_vals means]; % join groups and their means

【讨论】:

    【解决方案2】:

    我不确定我是否理解这个问题,因为您写道您想要计算第三列中值的平均值,但还要制作一个子矩阵。

    现在我假设您要计算第三列中前两列中所有值为 2 1 的值的平均值。代码看起来像这样

    mean21 = mean(S(S(:,1) == 2 & S(:,2) == 1,3))
    

    您首先计算一列布尔值,其中 col1 == 2 AND col2 == 1 (S(:,1) == 2 & S(:,2) == 1),然后检索 col3 的相应值。

    如果您想自动为任意大的矩阵执行此操作,以下是一种解决方案

    for c1 = unique(S(:,2))'
        for c2 = unique(S(:,2))'
            mean_val(c1,c2) = mean(S(S(:,1) == c1 & S(:,2) == c2,3));
        end
    end
    

    但是,如果组合 c1、c2 不存在,这将为您提供 NaN。

    【讨论】:

    • 嗯,子矩阵是为了更多的解释。是的,我可以像这样使用它,但不能用于 5000 个值。
    • 很公平。所以 5000 是指第 1 列和第 2 列中有 5000 个不同的值?
    • 我的意思是第 1 列的数字为 1-5000,第 2 列的数字为 1,2,3。
    • 我改变了上面的答案,不是循环完成的。
    最近更新 更多