Усреднение каждых 4 записей по 3-му измерению

Как я могу усреднить каждые 4 точки данных по 3-му измерению матрицы?

Моя матрица 245x85x1460 (lonxlatxhour). Поскольку 3-е измерение — это 6-часовые данные, а мне нужны ежедневные данные, я хочу усреднять каждые 4 точки данных (т. е. 1: 4, 5: 8 и т. д.) и в итоге получить матрицу размером 245x85x365.


person SugaKookie    schedule 26.07.2013    source источник


Ответы (3)


Используя reshape:

R = rand(245,85,1460); % Some random data, same dimensions as your example
szR = size(R);
A = squeeze(mean(reshape(R,[szR(1:2) 4 szR(3)/4]),3)); % Mean across 3rd dimension

Функция squeeze необходима для того, чтобы вернуть результат обратно к трем размерный массив. A(:,:,1) сверху должно быть эквивалентно mean(R(:,:,1:4),3) и так далее.

person horchler    schedule 26.07.2013

предполагая, что ваши данные хранятся в переменной old_data и вам нужен результат в new_data, можно использовать этот пример кода.

new_data=zeros(245,85,365);
for k=0,364
  new_data(:,:, k+1) = sum(old_data(:,:,4*k+1:4*k+4), 3)/4
end
person innoSPG    schedule 26.07.2013

Лучше всего использовать arrayfun для таких вещей. Предположим, ваши исходные данные находятся в matrix.

Создайте трехмерный индексный вектор для arrayfun для использования:

index3d=zeros(1,1,size(matrix,3)/4);
index3d(1,1,:)=(1:size(matrix,3)/4);

Используйте arrayfun, к сожалению, мы должны указать UniformOutput как false, что в результате приводит к массиву ячеек.

resultcell=arrayfun(@(x) mean(matrix(:,:,4*x-3:4*x), 3), index3d,'UniformOutput',false);

Преобразуйте массив ячеек в трехмерную матрицу:

result=cell2mat(resultcell);
person Marc Claesen    schedule 26.07.2013