我在矩阵中寻找不重复的行。
假设:
A =
8 1
2 2
2 2
2 2
2 2
3 6
5 7
5 7
我想得到“B”,这是:
B =
8 1
3 6
请注意 C = unique(A,'rows')会为我们提供唯一的“A”行,其中包含重复和非重复的数组,只删除重复的行。这意味着:
C =
2 2
3 6
5 7
8 1
“C”不是我要找的那个。
非常感谢任何帮助!
答案 0 :(得分: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
,使用稀疏选项(第六个输入参数)来保存内存以防大值:< / p>
[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];
答案 1 :(得分:2)
如果你不关心行的顺序,试试这个 -
[C,~,ic] = unique(A,'rows','legacy')
B = C(histc(ic,unique(ic))==1,:)