8

Suppose I have 2 input vectors x and reset of the same size

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

and an output y which is the cumulative sum of the elements in x. Whenever the value of resets corresponds to 1, the cumulative sum for the elements reset and start all over again just like below

y = [1 3 6 4 9 15]

How would I implement this in Matlab?

4

2 回答 2

7

一种方法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)
于 2015-05-09T10:01:33.417 回答
4

这里有一个方法:

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

这是有效的,因为如果对第一个输入进行accumarray排序,则保留第二个输入的每组内的顺序(更多信息请参见此处)。

于 2015-05-09T10:00:20.553 回答