Вычисление суммы элементов массива и повторение для всего массива в MATLAB

У меня есть вектор A размером 7812x1, и я хотел бы рассчитать сумму фиксированных окон длиной 21 (то есть 372 блока). Это следует повторить, чтобы выходные данные вернули вектор размером 372x1.

У меня t=7812, p=372, w=21;

for t=1:p
   out = sum(A((t*w-w+1):(t*w)));
end

Однако этот код не работает. Моя идея состоит в том, что часть ((t*w-w+1):(t*w)) допускает что-то вроде скользящего окна. Окно имеет длину 21, поэтому на самом деле нет необходимости выражать его с помощью переменных, но я думаю, что оно сохраняет некоторую гибкость.

Я видел потенциально связанные вопросы (такая частичная сумма вектора), но я не уверен, приведет ли это к желаемому результату.


person Joe    schedule 06.11.2017    source источник


Ответы (2)


Следуя вашей идее использования скользящего/движущегося окна (требуется Matlab 2016a или более поздней версии):

t = 7812; w = 21; % your parameters
A = rand(t,1); % generate some test data

B = movsum(A,w); % the sum of a moving window with width w
out = B(ceil(w/2):w:end); % get every w'th element
person Leander Moesinger    schedule 06.11.2017

Преобразуйте матрицу так, чтобы каждый блок A был столбцом, и вычислите сумму каждого столбца:

result = sum(reshape(A, w, []), 1);
person Luis Mendo    schedule 06.11.2017
comment
Я предполагаю, что в моем случае это должна быть сумма, а не среднее значение, чтобы получить те же результаты, что и у @Leander Moesinger. В противном случае я беру среднее значение каждого блока, верно? Тем не менее, решение интуитивно понятно и отлично работает. Большое спасибо! - person Joe; 06.11.2017
comment
@Joe Да, сумма вместо среднего, извините. Исправленный - person Luis Mendo; 06.11.2017