如果我有一个数组UTC
,我想查找非唯一条目列表:[1 2 3 4 3 5 6 7 8 7]
。我找不到一个简单的方法来做到这一点。有什么想法吗?
更新:我希望有一个通用的解决方案,它也适用于字符串的单元格数组。
答案 0 :(得分:5)
如果A的长度为n,您可以在每个条目第一次出现的A中找到索引并从A中删除它们:
A = [1 2 3 4 3 5 6 7 8 7];
n=length(A);
[~,IA,~] = unique(A);
out = unique(A(setdiff((1:n),IA)))
答案 1 :(得分:1)
[unqA,~,id] = unique(A);
out = unqA(histc(id,1:max(id))>1)
或使用accumarray
代替histc
-
out = unqA(accumarray(id(:),1)>1)
或使用bsxfun
-
out = unqA(sum(bsxfun(@eq,id(:),1:max(id(:)).'))>1)
样品运行 -
1)数字数组大小写 -
>> A
A =
6 3 7 7 4 3 8 5 2 3 1
>> [unqA,~,id] = unique(A);
>> unqA(histc(id,1:max(id))>1)
ans =
3 7
>> unqA(accumarray(id(:),1)>1)
ans =
3 7
>> unqA(sum(bsxfun(@eq,id(:),1:max(id(:)).'))>1)
ans =
3 7
2)细胞阵列案例 -
>> A = {'apple','banana','apple','mango','ball','cat','banana','apple'};
>> [unqA,~,id] = unique(A);
>> unqA(histc(id,1:max(id))>1)
ans =
'apple' 'banana'
>> unqA(accumarray(id(:),1)>1)
ans =
'apple' 'banana'
>> unqA(sum(bsxfun(@eq,id(:),1:max(id(:)).'))>1)
ans =
'apple' 'banana'
答案 2 :(得分:1)
x=[1 2 3 4 3 5 6 7 8 7];
y=x;
[~,ind,~]=unique(y);
y(ind)=[];
y是非唯一条目。
答案 3 :(得分:0)
由于您要求更通用的解决方案,因此这里应该可以轻松适应其他数据类型。与其他人相比,它也是一个O(n)解决方案 - 但缺点是在大量元素上缓慢的Matlab循环...
A = [1 2 3 4 3 5 6 7 8 7];
dupes = [];
map = containers.Map('KeyType', class(A), 'ValueType' , 'logical');
for i=1:numel(A)
if map.isKey(A(i))
dupes = [dupes A(i)];
else
map(i) = true;
end
end
答案 4 :(得分:-1)
使用sort
和diff
的另一种方法:
As = sort(A);
out = unique(As([false diff(As)==0]));