кончить только внутри группы? - PullRequest
3 голосов
/ 12 марта 2012

Допустим, у меня есть 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, для a, для группы два в b у меня есть только один в a и т. Д.

Ответы [ 3 ]

4 голосов
/ 12 марта 2012

Там были некоторые сложные ответы до сих пор. Попробуйте accumarray(b',a').

3 голосов
/ 12 марта 2012

Если вы ищете решение, где b может быть чем угодно, то комбинация hist и unique поможет:

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 голосов
/ 12 марта 2012

Предполагая, что 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

, что немного прощечитать.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...