2017-08-21 23 views
5

Có cách nào để tính toán giá trị trung bình di chuyển theo cách mà các giá trị ở đầu và cuối của mảng được tính trung bình với các giá trị ở đầu đối diện không?di chuyển trung bình trên một vòng tròn

Ví dụ, thay vì kết quả này:

A=[2 1 2 4 6 1 1]; 
movmean(A,2) 
ans = 2.0 1.5 1.5 3.0 5 3.5 1.0 

Tôi muốn để có được những vector [1.5 1.5 1.5 3 5 3.5 1.0], như mảng yếu tố ban đầu 2 sẽ được tính trung bình với các yếu tố kết thúc 1.

Trả lời

5

Khái quát đến một tùy ý kích thước cửa sổ N, đây là cách bạn có thể thêm hành vi hình tròn để movmean trong cách bạn muốn:

movmean(A([(end-floor(N./2)+1):end 1:end 1:(ceil(N./2)-1)]), N, 'Endpoints', 'discard') 

Đối với trao AN = 2, bạn nhận được:

ans = 

1.5000 1.5000 1.5000 3.0000 5.0000 3.5000 1.0000 
+0

ngọt ngào! không nghĩ thế. cảm ơn! – shamalaia

2

Convolution cung cấp một số đẹp cách làm điều này. Mặc dù, bạn có thể cần phải tinh chỉnh đầu vào của mình một chút nếu bạn chỉ đi trung bình một phần kết thúc (tức là giá trị đầu tiên được tính trung bình với giá trị cuối cùng trong ví dụ của bạn, nhưng giá trị cuối cùng không được tính trung bình đầu tiên).

conv([A(end),A],[0.5 0.5],'valid') 

ans = 

    1.5000 1.5000 1.5000 3.0000 5.0000 3.5000 1.0000 

Trường hợp tổng quát ở đây, đối với một trung bình trượt của kích thước N, là:

conv(A([end-N+2:end, 1:end]),repmat(1/N,1,N),'valid') 
+0

Tôi đã suy nghĩ để làm điều đó theo cách này. Nhưng điều mà tôi không thích trong giải pháp này là sau đó đầu ra có các kích thước khác nhau. Ngoài ra, chuyển đổi nếu thay vì 2 giá trị, chúng tôi tính trung bình vào nhiều hơn. Tất nhiên tôi có thể cắt đầu ra, nhưng tôi đã tự hỏi nếu có một cách sạch hơn để làm điều đó – shamalaia

+0

Tôi thấy, đầu ra có kích thước chính xác cho 'conv' nếu bạn có cờ' 'valid'', nhưng có, gnovice's giải pháp cho thấy các cờ cho 'movmean' để có được kết quả mong muốn ở đó. – informaton

+0

Tôi đã cập nhật câu trả lời của mình để hiển thị biểu mẫu tổng quát cho 'conv' và đưa ra câu trả lời' movmean' vì câu trả lời đó được che phủ tốt hơn bởi @gnovice. – informaton

2

Đối với một tùy ý kích thước cửa sổ n, bạn có thể sử dụng circular convolution với một mặt nạ trung bình được xác định như [1/n ... 1/n] (với n mục; trong ví dụ của bạn n = 2):

result = cconv(A, repmat(1/n, 1, n), numel(A)); 
Các vấn đề liên quan