Как найти сумму 3 элемента в массиве? - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть массив A=[a1,a2,a3, ..., aN] Я хотел бы взять произведение каждых 3 элементов:

s1=a1+a2+a3

s2=a4+a5+a6

...

sM=a(N-2)+a(N-1)+aN

Мое решение:

k=size(A);
s=0;
for n=1:k
s(n)=s(n-2)+s(n-1)+s(n);
end

Ошибка: Попытка доступа s (2);Индекс выходит за границы, потому что число = 1.

Как это исправить?

Ответы [ 3 ]

2 голосов
/ 24 сентября 2019

Если вы хотите суммировать в блоки , для общего случая, когда число элементов A равно , не обязательно кратное размера блока, вы можете использовать accumarray:

A = [3 8 5 8 2 3 4 7 9 6 4]; % 11 elements
s = 3; % block size
result = accumarray(ceil((1:numel(A))/s).', A(:));

Если вы хотите получить скользящую сумму с заданным размером блока, вы можете использовать conv:

A = [3 8 5 8 2 3 4 7 9 6 4]; % 11 elements
s = 3; % block size
result = conv(A(:).', ones(1,s), 'valid');
1 голос
/ 24 сентября 2019
  • Вы инициализируете s как скаляр с s = 0.Затем вы пытаетесь индексировать его как массив, но он имеет только один элемент.
  • Ваша текущая логика (если исправлена) вычислит это:

    s(1) = a(1)+a(2)+a(3) 
    s(2) = a(2)+a(3)+a(4)
    ... 
    % 's' will be 2 elements shorter than 'a'
    

    Так что нам нужночтобы быть немного мудрее с индексированием, чтобы получить то, что вы описываете, то есть

    s(1) = a(1)+a(2)+a(3) 
    s(2) = a(4)+a(5)+a(6)
    ... 
    % 's' will be a third as big as 'a'
    

Вы должны предварительно выделить s для правильного размера, например так:

k = numel(A); % Number of elements in 'A'
s = zeros( 1, k/3 ); % Output array, assuming 'k' is divisible by 3
for n = 0:3:k-3
    s(n/3+1) = a(n+1) + a(n+2) + a(n+3);
end

Вы можете сделать это в одну строку, изменив массив на 3 строки, а затем суммируя каждый столбец, это предполагает, что количество элементов в a делится на 3, а a равновектор строки ...

s = sum( reshape( a, 3, [] ) );
1 голос
/ 24 сентября 2019

Вы пытаетесь вычислить s, используя значения из s.Разве вы не имеете в виду s(n)=A(n-2)+A(n-1)+A(n);?Кроме того, size возвращает более одного измерения самостоятельно.

При этом получение 2 приватных значений n-2 и n-1 делает работу для n = 1; 2 (потому что у вас должны быть положительные индексы).Вы должны объяснить, как должны обрабатываться первые два значения.Я предполагаю, что либо 0 для элементов, которые еще не существуют

k=size(A,2); %only the second dimension when A 1xn, or length(A) 
s=zeros(1,k); %get empty values instead of appending each value for better performance
s(1)=A(1);
s(2)=A(2)+A(1);
for n=3:k %start at 3 
    s(n)=A(n-2)+A(n-1)+A(n);
end

, либо s должно быть на 2 значения короче, чем A.

k=size(A,2);
s=zeros(1,k-2);
for n=1:k-2
    s(n)=A(n)+A(n+1)+A(n+2); 
end
...