Подсчет одинаковых строк 2D-матрицы

У меня есть матрица из двух столбцов. Мне нужно сделать три столбца, где третий столбец показывает количество появления первых двух в виде строки во входной матрице.

В основном: Ввод

[1 1;
 1 1;
 1 2;
 1 2;
 1 3]

Желаемый результат:

[1 1 2;
 1 2 2;
 1 3 1]

Я уже знаю, что правильное сочетание accumarray и unique должно создавать очарование. Я просто не знаю, как правильно их сочетать.


person Victor Pira    schedule 23.07.2017    source источник


Ответы (2)


Вы правы, 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

Одно из возможных решений:

clear
a=...
[1 1;
 1 1;
 1 2;
 1 2;
 1 3]

[U,~,ic]=unique(a,'rows');
[C] = histc(ic,unique(ic));
Result=[U,C]
person Mendi Barel    schedule 23.07.2017
comment
Жаль, что histc устарело. С новым hitstcounts вам нужно будет добавить inf и транспонировать, чтобы добиться того же: C = histcounts(ic,[unique(ic); inf]).' - person Luis Mendo; 24.07.2017