Имея матрицу случайных данных x
:
x = randn(27,16800);
, вы можете вычислить среднее значение по всем группам значений n=10
вдоль строк двумя аналогичными способами, как описано Луис Мендо и Brice в комментариях:
y = permute(mean(reshape(x.', n, [], size(x,1)), 1), [3 2 1]); % Luis
y = squeeze(mean(reshape(x,size(x,1),n,[]),2)); % Brice
Однако, как отмечает Wolfie , они работают, только если длина строк точно делится на n
.
Более общий подход может быть получен путем свертки:
y = conv2(x,ones(1,n)/n,'valid');
y = y(:,1:n:end);
Каждый матричный элемент на выходе свертки представляет собой среднее значение по n
значениям.Этот результат на n-1
элемента короче, чем вход.То есть мы вычислили n
раз столько средних, сколько нужно.Вторая строка берет первое из каждых n
средних значений, получая результат ожидаемого размера.
Свертка дает результат, который отличается от других методов числовой неточностью (максимальная разница составляет 4,4409e-16на моей машине).Это связано с тем, что conv2
реализован с использованием SIMD-инструкций вашего процессора, тогда как mean
, скорее всего, нет.Метод свертки может быть несколько медленнее, чем другой, но он универсален и его легко адаптировать.