计算相同的2D矩阵行

时间:2017-07-23 22:12:42

标签: matlab octave accumarray

我有一个两列矩阵。我需要将它设为三列,其中第三列显示输入矩阵中前两个的外观数量。

基本上:输入

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

期望的输出:

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

我已经知道,准确和独特的正确组合应该具有魅力。我只是不知道如何正确地组合它们。

2 个答案:

答案 0 :(得分:3)

你是对的,uniqueaccumarray非常适合这项任务:

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的条目是正整数并且您希望以字典顺序输出的特殊情况,您还可以使用sparsefind,如下所示:

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

答案 1 :(得分:3)

一种可能的解决方案:

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]