Для каждого элемента в векторе суммируйте предыдущие n элементов

#matlab #optimization #sum

#matlab #оптимизация #сумма

Вопрос:

Я пытаюсь написать функцию, которая суммирует предыдущие n элементов для каждого элемента

     v = [1 1 1 1 1 1];
    res = sumLastN(v,3);
    res = [0 0 3 3 3 3];
  

До сих пор я писал следующую функцию

     function [res] = sumLastN(vec,ppts)

        if iscolumn(vec)~=1
            error('First argument must be a column vector')
        end

        sz_x = size(vec,1);
        res = zeros(sz_x,1);
        if sz_x > ppts
            for jj = 1:ppts
                res(ppts:end,1) = res(ppts:end,1)   ...
                    vec(jj:end-ppts jj,1);
            end
    %         for jj = ppts:sz_x
    %             res(jj,1) = sum(vec(jj-ppts 1:jj,1));
    %         end
        end

    end
  

Существует около 2000 векторов, содержащих около 1 миллиона элементов, поэтому мне было интересно, может ли кто-нибудь дать мне какой-либо совет о том, как я мог бы ускорить работу функции.

Ответ №1:

Использование cumsum должно быть намного быстрее:

 function [res] = sumLastN(vec,ppts)
w=cumsum(vec)
res=[zeros(1,ppts-1),w(ppts 1:end)-w(1:end-ppts)]
end
  

Ответ №2:

По сути, вам нужен фильтр скользящего среднего, только без усреднения.

Используйте цифровой filter :

 n = 3;
v = [1 1 1 1 1 1];

res = filter(ones(1,n),1,v)
res =
         1     2     3     3     3     3
  

Я не понимаю, почему первые два элемента должны быть равны нулю, но почему бы и нет:

 res(1:n-1) = 0
res =
         0     0     3     3     3     3