Arrays 求其他指标控制参数的平均值

Arrays 求其他指标控制参数的平均值,arrays,matlab,matrix,average,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列是一

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

我在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列是一些温度测量值

第二列是表示颜色的索引代码(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乘5

我相信有一个较短的方法可以做到这一点

谢谢

关于

试试这个:

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.6
t=1
的预期答案是错误的。。。是否应该是
(17+24)/2=20.5

这可以通过以下方式实现,也许更简洁:


太神了谢谢你的帮助。顺便说一句,我怎样才能像这样学习编码和逻辑索引?我有一些Matlab的中等背景。你的代码省时省力。我写了很长的if和for循环,试图得到答案。谢谢。很抱歉我计算了17+24=30。你说得对。不客气:)除了经验之外,我想不出任何关于逻辑索引的具体学习材料(从技术上讲,这不是逻辑索引,但想法是一样的)。以这个为例,试着去理解发生了什么,然后下次你需要它的时候,它可能会派上用场:)如果你一点都不懂,我很乐意尝试解释。你不需要使用find。下面的结果应该是相同的:match=(A(:,2)=c)和(A(:,3)=t);B(匹配)=平均值(A(匹配,1));
[~, ~, 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