Finding the average of parameters controlled by other indices

戏子无情 提交于 2019-12-12 03:20:03

问题


I need some help in this problem

I have this matrix in 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];  

1st column is some measured values for temperature

2nd column is an index code representing the color (1.2:red,.....etc)

3rd column is the hour of taking the sample. Only at hours from 1 to 2

I want the matrix to be controlled by 2nd column as follows:

if it is 1.2, the program will find the average of all temperatures at hour 1 that

corresponds to 1.2

So, here ( 25 + 23 )/2 = 24

and also finds the average of all temperatures at hour 2 and that corresponds

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

and this average values:

                     [24 
                      28.5]

will replace all temperature values at hours 1 and 2

that corresponds to 1.2 .

Then, it does the same thing for indices 2.6 and 15

So, the desired output will be:

B = [  24
       28.5

       15.5
       22

       24
       28.5

       19
       22

       15.5
       22]

My problem is in using the loop. I could do it for only one index at one run.

for example,

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

So, T is the extracted T that corresponds to 1.2 and other entries are zeros

Then, I wrote long code to find the average and at the end I could find the matrix

that corresponds to ONLY the index 1.2 :

B =   [24
       28.5

       0
       0

       24
       28.5

       0
       0

       0
       0]

But this is only for one index and it assigns zeros for the other indices. I can do this for all

indices in separate runs and then add the B's but this will take very long time since my real

matrix is 8760 by 5 .

I am sure that there is a shorter way to do that.

Thanks

Regards


回答1:


Try this:

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

Edit I think your expected answer is wrong for c = 2.6 and t = 1... Shouldn't it be (17 + 24)/2 = 20.5?




回答2:


This can be done, perhaps more neatly, with 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


来源:https://stackoverflow.com/questions/8650037/finding-the-average-of-parameters-controlled-by-other-indices

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!