2015-05-09 35 views
8

Giả sử tôi có 2 đầu vào vector xreset của cùng một kích thướcTổng kết tích lũy trong khoảng thời gian - MATLAB

x = [1 2 3 4 5 6] 
reset = [0 0 0 1 0 0] 

và một đầu ra y mà là tổng tích lũy của các yếu tố trong x. Bất cứ khi nào giá trị của số reset tương ứng với 1, tổng tích lũy cho các phần tử được đặt lại và bắt đầu lại như sau:

y = [1 3 6 4 9 15] 

Làm cách nào để thực hiện điều này trong Matlab?

Trả lời

7

Một cách tiếp cận với diffcumsum -

%// Setup few arrays: 
cx = cumsum(x)   %// Continuous Cumsumed version 
reset_mask = reset==1 %// We want to create a logical array version of 
         %// reset for use as logical indexing next up 

%// Setup ID array of same size as input array and with differences between 
%// cumsumed values of each group placed at places where reset==1, 0s elsewhere 
%// The groups are the islands of 0s and bordered at 1s in reset array. 
id = zeros(size(reset)) 
diff_values = x(reset_mask) - cx(reset_mask) 
id(reset_mask) = diff([0 diff_values]) 

%// "Under-compensate" the continuous cumsumed version cx with the 
%// "grouped diffed cumsum version" to get the desired output 
y = cx + cumsum(id) 
+0

Hey, nó hoạt động rất tốt nhưng bạn sẽ có thể giải thích phần này của mã. id (reset == 1) = diff ([0 diff1 (reset == 1)]) – Alex

+0

@Alex Chắc chắn rồi, sắp tới. – Divakar

+0

Cảm ơn rất nhiều. Đã gãi đầu của tôi về điều này trong một thời bây giờ. – Alex

4

Đây là một cách:

result = accumarray(1+cumsum(reset(:)), x(:), [], @(t) {cumsum(t).'}); 
result = [result{:}]; 

này hoạt động bởi vì nếu đầu vào đầu tiên accumarray được sắp xếp, thứ tự trong mỗi nhóm của đầu vào thứ hai được bảo tồn (thêm về here này).

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