Вы правы, unique
и accumarray
идеально подходят для этой задачи:
x = [1 1; 1 1; 1 2; 1 2; 1 3]; % input
[~, v, w] = unique(x, 'rows', 'stable'); % unique indices and labels
c = accumarray(w, 1); % counts
y = [x(v,:) c]; % output
Снимите флаг 'stable'
, если вы хотите, чтобы выходные строки сортировались в лексикографическом порядке.
Вы также можете заменить accumarray
на bsxfun
, чтобы получить количество:
c = sum(bsxfun(@eq, unique(w), w.'), 2);
Для особого случая, когда записи x
являются положительными целыми числами, и вы хотите, чтобы вывод был в лексикографическом порядке, вы также можете использовать sparse
и find
следующим образом:
x = [1 1; 1 1; 1 2; 1 2; 1 3]; % input
[ii,jj,vv] = find(sparse(x(:,1), x(:,2), 1));
y = [ii(:), jj(:), vv(:)]; % output
person
Luis Mendo
schedule
23.07.2017