# Cumsum only within groups?

Suppose I have 2 vectors:

``````a=[0 1 0 1 1 0 1 0 0 0 1 1 1];
b=[1 1 1 1 1 1 2 2 2 3 3 3 3];
```

```

For each group of numbers in b, I want a cumsum so that the result looks like this:

``````c=[1 3;2 1;3 3]
```

```

This means I have the ones b 3 in a, for group two in b. I only have one in, etc.

+3

source to share

If you are looking for a solution, which `b`

can be anything, then the combination `hist`

and `unique`

helps you:

``````num = unique(b(logical(a))); %# identify the numbers in b with non-zero counts
cts = hist(b(logical(a)),num); %# count
c = [num(:),cts(:)]; %# combine.
```

```

If you want the first column to `c`

go from 1 to the maximum `b`

, you can rewrite the first row as `num=1:max(b)`

and you will also get rows in `c`

where counts are zero.

+3

source

There have been some tricky answers so far. Try it `accumarray(b',a')`

.

+4

source

Assuming `b`

monotonically increasing by 1:

``````c = cell2mat(transpose(arrayfun( @(x) [ x sum(a(find( b == x ))) ], min(b):max(b), 'UniformOutput',false)))
```

```

should give the correct answer in a single liner format, or:

``````for ii=min(b):max(b)
II = find( b == ii );
v = sum(a(II));
c(ii,:) = [ii v];
end
```

```

which is a little easier to read. Hope this helps.

+2

source

All Articles