2

我正在寻找矩阵中不重复的行。

认为:

一个=

 8     1
 2     2
 2     2
 2     2
 2     2
 3     6
 5     7
 5     7

我想得到“B”,即:

乙=

 8     1
 3     6

请注意C=unique(A,'rows')将为我们提供唯一的“A”行,其中包括重复和非重复的数组,并且只删除重复的行。它的意思是:

C =

 2     2
 3     6
 5     7
 8     1

“C”不是我要找的那个。

任何帮助将不胜感激!

4

2 回答 2

3

使用unique如下的第二个和第三个输出:

[~, ii, jj] = unique(A,'rows');
kk = find(histc(jj,unique(jj))==1);
B = A(sort(ii(kk)),:);

或者使用这种更直接bsxfun的方法:

B = A(sum(squeeze(all(bsxfun(@eq, A.', permute(A, [2 3 1])))))==1,:);

这两种方法非常普遍:A可能有任意数量的列,并且可能包含非整数值。


如果A总是有两列并且只包含整数值,您也可以accumarray使用 sparse 选项(第六个输入参数)来执行此操作,以在值较大的情况下节省内存:

[ii jj] = find(accumarray(A, 1, [], @sum, 0, true)==1);
B = [ii jj];

或者您可以使用sparse而不是accumarray

[ii jj] = find(sparse(A(:,1),A(:,2),1)==1);
B = [ii jj];
于 2014-05-30T16:51:49.470 回答
2

如果你不关心行的顺序,试试这个 -

[C,~,ic] = unique(A,'rows','legacy')
B = C(histc(ic,unique(ic))==1,:)
于 2014-05-30T16:54:44.640 回答