Вы можете использовать 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)]