Усреднение каждых 10 чисел в матрице в Matlab - PullRequest
0 голосов
/ 19 ноября 2018

Как получить в среднем каждые 10 чисел в большой матрице (27x16800).Я не могу найти решение Если кто-то может помочь, это было бы здорово.

UPD Извините, мне следовало быть более ясным.У меня есть матрица записанных значений (16800) для 27 предметов.Каждый предмет соответствует ряду;Я хочу получить новую матрицу из 27 предметов с 1680 усредненными числами в строках (тогда как каждые «старые» 10 чисел в строках будут усредняться до 1 «нового» среднего числа).

1 Ответ

0 голосов
/ 20 ноября 2018

Имея матрицу случайных данных 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, скорее всего, нет.Метод свертки может быть несколько медленнее, чем другой, но он универсален и его легко адаптировать.

...