Как извлечь новую матрицу из существующей - PullRequest
3 голосов
/ 31 мая 2011

У меня большое количество записей в трех столбцах.Пример данных:

A=[1 3 2 3 5 4 1 5 ; 
   22 25 27 20 22 21 23 27; 
   17 15 15 17 12 19 11 18]'

Я хочу, чтобы первый столбец (часы) управлял всей матрицей для создания новой матрицы следующим образом:

Anew=[1 2 3 4 5 ; 22.5 27 22.5 21 24.5; 14 15 16 19 15]'

Где 2-й столбец Anew - это среднее значение каждого соответствующего часа, например:

из матрицы A: в час 1 у нас есть 2 значения во 2-м столбце, соответствующих часу 1, которые равны 22 и 23, поэтому среднее значение равно 22,5

Также 3-й столбец: в час 1 у нас есть 17 и 11, а среднее значение равно 14, и это продолжается до часа 5, я использую Matlab

Ответы [ 2 ]

4 голосов
/ 31 мая 2011

Вы можете использовать ACCUMARRAY для этого:

Anew = [unique(A(:,1)),...
        cell2mat(accumarray(A(:,1),1:size(A,1),[],@(x){mean(A(x,2:3),2)}))]

При этом первый столбец A(:,1) используется в качестве индексов (x), чтобы выбрать значения в столбцах 2 и 3 дляусреднение (mean(A(x,2:3),1)).Кудрявые скобки и вызов cell2mat позволяют работать сразу в обоих столбцах.В противном случае вы можете сделать каждый столбец по отдельности, например,

Anew = [unique(A(:,1)), ...
        accumarray(A(:,1),A(:,2),[],@mean), ...
        accumarray(A(:,1),A(:,3),[],@mean)]

, который на самом деле может быть немного более читабельным.

РЕДАКТИРОВАТЬ

ВышеПредполагается, что нет пропущенных записей для любого из часов.В противном случае это приведет к ошибке.Таким образом, более надежный способ вычисления Anew - учесть пропущенные значения.Для простой идентификации пропущенных значений мы используем входной аргумент fillval равным accumarray и устанавливаем его на NaN.

Anew = [(1:max(A(:,1)))', ...
        accumarray(A(:,1),A(:,2),[],@mean,NaN), ...
        accumarray(A(:,1),A(:,3),[],@mean,NaN)]
2 голосов
/ 31 мая 2011

Вы можете использовать консолидатор , чтобы сделать работу за вас.

[Afinal(:,1),Afinal(:,2:3)] = consolidator(A(:,1),A(:,2:3),@mean);

Afinal
Afinal =
            1         22.5           14
            2           27           15
            3         22.5           16
            4           21           19
            5         24.5           15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...