我正在寻找矩阵中不重复的行。
假设:
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”不是我要找的。p>
任何帮助将不胜感激!
最佳答案
使用 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
来完成此操作。 ,使用稀疏选项(第六个输入参数)在值较大时节省内存:
[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];
关于arrays - matlab中矩阵中的不重复数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23959531/