Нахождение среднего значения параметров, контролируемых другими показателями - PullRequest
0 голосов
/ 28 декабря 2011

Мне нужна помощь в этой проблеме

У меня есть эта матрица в 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-й столбец - этоиндексный код, представляющий цвет (1,2: красный, ..... и т. д.)

3-й столбец - час взятия образца.Только в часы от 1 до 2

Я хочу, чтобы матрица управлялась 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.

IЯ уверен, что есть более короткий способ сделать это.

Спасибо

С уважением

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Попробуйте:

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?

0 голосов
/ 31 марта 2014

Это можно сделать, возможно, более аккуратно, с помощью 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
...