#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