matlab中矩阵中的非重复数组

时间:2014-05-30 16:43:14

标签: arrays matlab matrix unique non-repetitive

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

假设:

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”不是我要找的那个。

非常感谢任何帮助!

2 个答案:

答案 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,:)