查找其他指数控制的参数平均值

时间:2011-12-27 22:41:34

标签: arrays matlab matrix average

我在这个问题上需要一些帮助

我在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是提取的T,对应于1.2,其他条目为零

然后,我编写了长代码来查找平均值,最后我找到了矩阵

仅对应于索引1.2:

B =   [24
       28.5

       0
       0

       24
       28.5

       0
       0

       0
       0]

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

单独运行中的

指数,然后添加B,但这需要很长时间才能实现

矩阵是8760乘5。

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

由于

此致

2 个答案:

答案 0 :(得分:2)

试试这个:

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吗?

答案 1 :(得分:0)

使用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