只在团体内的cumsum?

时间:2012-03-12 14:07:15

标签: matlab vector

假设我有2个向量:

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];

对于b中的每组数字,我想要积累,所以结果看起来应该是这样的:

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

这意味着我有b 3中的那些,b中的第2组我只有一个等等。

3 个答案:

答案 0 :(得分:4)

到目前为止,有一些复杂的答案。试试accumarray(b',a')

答案 1 :(得分:3)

如果您正在寻找b可以是任何内容的解决方案,那么histunique的组合将有所帮助:

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. 

如果您希望c的第一列从1变为b的最大值,那么您可以将第一行重写为num=1:max(b),并且您还可以获得行在c中,计数为零。

答案 2 :(得分:2)

假设b单调增加1:

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

应以单行格式给出正确答案,或:

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

这有点容易阅读。希望这会有所帮助。