2011-12-27 21 views
0

我需要一些帮助在此问题控制求出平均的参数由其他指数

我有这个矩阵在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 5这将花费很长的时间。

我相信有一个更简单的方法来做到这一点。

感谢

问候

回答

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

+0

惊人。感谢您的帮助。BTW,我如何学习这种编码和逻辑索引?我在Matlab中有一些中等背景。你的代码是节省时间和精力的。我写了很长的如果和为了循环试图得到答案。谢谢。抱歉。我计算了17 + 24 = 30。你说得对。 – 2011-12-27 23:17:21

+0

不客气:)我想不出任何具体的学习材料,除了经验之外,对于逻辑索引(从技术上讲,这不是逻辑索引,但这个想法是相同的)。以此为例,并尝试了解发生了什么,然后下次需要它时,它可能会派上用场。如果您不明白其中的任何内容,我很乐意尝试解释。 – dantswain 2011-12-28 00:05:49

+0

你不需要使用find。以下应该给出相同的结果: match =(A(:, 2)== c)&(A(:, 3)== t); B(match)= mean(A(match,1)); – grantnz 2011-12-28 08:24:44

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