【问题标题】:Finding the average of parameters controlled by other indices求其他指标控制的参数的平均值
【发布时间】:2011-12-27 22:41:33
【问题描述】:

我需要一些帮助来解决这个问题

我在 MATLAB 中有这个矩阵:

A = [ 25    1.2    1
      28    1.2    2
      17    2.6    1
      18    2.6    2
      23    1.2    1
      29    1.2    2
      19    15     1
      22    15     2
      24    2.6    1
      26    2.6    2];  

第一列是温度的一些测量值

第二列是代表颜色的索引代码(1.2:红色,.....等)

第 3 列是取样的时间。仅在从 1 点到 2 点的时间

我希望矩阵由第二列控制如下:

如果是 1.2,程序将在第 1 小时找到所有温度的平均值

对应1.2

所以,这里 (25 + 23)/2 = 24

还找到第 2 小时所有温度的平均值,并且对应

到 1.2, ( 28 + 29 ) /2 = 28.5

这个平均值:

                     [24 
                      28.5]

将替换第 1 小时和第 2 小时的所有温度值

对应于 1.2。

然后,它对索引 2.6 和 15 执行相同的操作

因此,所需的输出将是:

B = [  24
       28.5

       15.5
       22

       24
       28.5

       19
       22

       15.5
       22]

我的问题在于使用循环。我可以一次只为一个索引执行此操作。

例如,

T=[];
   index=1.2;

   for i=1:length(A)
       if A(i,2)==index
        T=[T A(i,1)];
    else
        T=[T 0];
       end
   end

所以,T 是提取的对应于 1.2 的 T,其他条目为零

然后,我写了很长的代码来求平均值,最后我可以找到矩阵

仅对应于索引 1.2:

B =   [24
       28.5

       0
       0

       24
       28.5

       0
       0

       0
       0]

但这仅适用于一个索引,它为其他索引分配零。我可以为所有人做到这一点

单独运行索引,然后添加 B,但这需要很长时间,因为我的真实

矩阵是 8760 x 5。

我确信有更短的方法可以做到这一点。

谢谢

问候

【问题讨论】:

    标签: arrays matlab matrix average


    【解决方案1】:

    试试这个:

    B = zeros(size(A, 1), 1);
    C = unique(A(:, 2))';
    T = [1 2];
    
    for c = C,
      for t = T,
          I1 = find((A(:, 2) == c) & (A(:, 3) == t));
          B(I1) = mean(A(I1, 1));
      end
    end
    

    编辑 我认为您对c = 2.6t = 1 的预期答案是错误的……不应该是(17 + 24)/2 = 20.5 吗?

    【讨论】:

    • 太棒了。感谢您的帮助。顺便说一句,我怎样才能学习这样的编码和逻辑索引?我在 Matlab 中有一些中等背景。您的代码节省了时间和精力。我写了很长的 if 和 for 循环来试图得到答案。谢谢。对不起。我计算了 17 + 24 = 30。你是对的。
    • 不客气 :) 除了经验之外,我想不出任何特定的逻辑索引学习材料(从技术上讲,这不是逻辑索引,但想法是一样的)。以这个为例,试着理解发生了什么,那么下次你需要它时,它也许会派上用场:) 如果你不明白,我很乐意解释。
    • 您不需要为此使用 find 。以下应该给出相同的结果: match = (A(:, 2) == c) & (A(:, 3) == t); B(match) = mean(A(match, 1));
    【解决方案2】:

    这可以通过accumarray 完成,或许更简洁:

    [~, ~, ii] = unique(A(:,2)); %// indices corresponding to second col values
    ind = [ii A(:,3)]; %// build 2D-indices for accumarray
    averages = accumarray(ind, A(:,1), [], @mean); %// desired averages of first col
    result = averages(sub2ind(max(ind), ind(:,1), ind(:,2))); %// repeat averages
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-12
      • 2018-05-03
      • 2019-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-08
      • 2013-01-13
      相关资源
      最近更新 更多