2015-03-25 27 views
5

Hãy xem xét những mảngSum nhóm liên tiếp của các yếu tố của một mảng

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

Bạn có thể sau đó một cách dễ dàng thêm hai số liên tiếp trong mảng với nhau trong Matlab, như vậy bạn sẽ có được:

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

Lưu ý rằng mỗi phần tử chỉ xuất hiện trong một tổng.

+1

Bạn có nhiều câu trả lời hay ở đây. Trả tiền trước và chấp nhận một trong các câu trả lời ở đây theo @thewaywewalk được mô tả. Xin cảm ơn. – rayryeng

Trả lời

8

Với sumreshape -

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

Với interp1 dựa trên 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)) 

Nếu chơi code-golf, vec2mat từ Communications System Toolbox có thể được sử dụng -

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

Hoặc thậm chí nhỏ gọn hơn -

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

Hãy thử một cái gì đó như:

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

Có:

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

nhất,

4

Trong trường hợp numel (A) không phải lúc nào cũng mặc:

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

Heh, đó là chính xác những gì tôi sẽ đặt. Đã đến lúc nghĩ ra câu trả lời khác! – rayryeng

0

Nếu bạn cho rằng A có một số chẵn các yếu tố (xn là chẵn), đây là một giải pháp:

  • Extract yếu tố lẻ để một tiểu mảng gọi odd_arr
  • Extract thậm chí yếu tố để một tiểu mảng gọi even_arr
  • Thêm hai tiểu mảng với nhau để làm cho B

Đây là mã Matlab (Long Version):

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

Dưới đây là phiên bản ngắn:

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

Tôi hy vọng rằng tác phẩm cho bạn.

+0

Tôi không chắc điều này khác với câu trả lời của Ratbert và jojek. – rayryeng

+0

Rất thú vị. Rõ ràng trong khi viết câu trả lời của tôi, Ratbert và jojek đã đưa ra giải pháp tương tự. – stacky

0

này nên làm các trick

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

Cảnh báo: 'downsample' chỉ có sẵn trong hộp công cụ Xử lý tín hiệu. Mã này không thể chạy mà không có nó. – rayryeng

2

Dưới đây là hai cách tiếp cận khác cho các kích cỡ nhóm chung:

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

Tiếp cận 1

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

B = 3 7 11 15 

Tiếp cận 2

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

B = 3 7 11 15 9 

Advantage trên , Ratberts'sJolek'sgiải pháp là nó cũng làm việc cho vectơ A mà không dividable bởi kích thước nhóm. Hãy lưu ý rằng cả hai phương pháp tiếp cận của tôi đối phó hơi khác nhau đối với phần tử cuối cùng trong trường hợp này.

Các vấn đề liên quan