2015-03-25 25 views
5

Rozważmy tablicęSum kolejnych grup elementów tablicy

A = [x1,x2,x3,...,xn] 

Następnie można w łatwy sposób dodać dwa kolejne numery w tablicy razem w Matlab, dzięki czemu można uzyskać:

B = [x1+x2, x3+x4,...] 

Należy zauważyć, że każdy element pojawia się tylko w jednej sumie.

+1

Masz wiele dobrych odpowiedzi tutaj. Płać naprzód i przyjmij jedną z odpowiedzi tutaj, jak opisano na @thewaywewalk. Proszę i dziękuję. – rayryeng

Odpowiedz

8

Z sum i reshape -

B = sum(reshape(A,2,[]),1) 

Z interp1 podstawie this -

nA = numel(A); 
start = 1/(2*nA-2); 
stop = 1 - start; 
B = 2*interp1(linspace(0,1,nA), A,linspace(start,stop,nA/2)) 

Jeśli gra code-golf, vec2mat z Communications System Toolbox mogą być wykorzystane -

B = sum(vec2mat(A,2),2) 

lub nawet bardziej kompaktowy -

B = sum(vec2mat(A,2)') 
5

spróbować czegoś jak:

B = A(1:2:end)+A(2:2:end) 
5

Tak:

B = A(1:2:end) + A(2:2:end); 

Best,

4

W przypadku numel (A) nie zawsze jest nawet:

accumarray(ceil([1:numel(A)]'/2),A(:)) 
+2

Heh, dokładnie to chciałem dodać. Czas pomyśleć o innej odpowiedzi! – rayryeng

0

Jeśli założyć, że A ma parzystą liczbę elementów (xn jest nawet), tutaj jedno rozwiązanie:

  • Extract nieparzyste elementy do sub-tablicy nazywanej odd_arr
  • Wyciąg nawet elementy do podzestawu tablicy zwanej even_arr
  • Dodanie dwóch tablic podrzędnych razem do B

Oto kod Matlab (Long Version):

odd_arr = A(1:2:end); 
    even_arr = A(2:2:end); 
    B  = odd_arr + even_arr; 

Oto krótka wersja:

B = A(1:2:end) + A(2:2:end); 

Mam nadzieję, że pracuje dla Ciebie.

+0

Nie jestem pewien, jak to się różni od odpowiedzi Ratberta i Jojeka. – rayryeng

+0

To bardzo interesujące. Podobno podczas pisania odpowiedzi, Ratbert i Jojek zaproponowali to samo rozwiązanie. – stacky

0

To powinno załatwić sprawę

 B = downsample(A + [A(2:end), 0], 2) 
+0

Ostrzeżenie: 'downsample' jest dostępna tylko w przyborniku przetwarzania sygnału. Ten kod nie może być bez niego uruchomiony. – rayryeng

2

Oto dwa inne podejścia do ogólnych rozmiarów Grupa:

A = [ 1 2 3 4 5 6 7 8 9 ] 
groupsize = 2; 

Approach 1

B = filter(ones(groupsize,1), 1, A) 
B = B(groupsize:groupsize:end) 

B = 3 7 11 15 

Metoda 2

B = conv(A,ones(groupsize,1)) 
B = B(groupsize:groupsize:end) 

B = 3 7 11 15 9 

Charakteryzuje , Ratberts's i Jolek'sroztworu jest to, że działa również wektory A które nie są wielokrotnością rozmiaru grupy. Miej świadomość, że oba moje podejścia dotyczą nieco innego dla ostatniego elementu w tym przypadku.