在Matlab中查找数组的非唯一元素

时间:2015-09-23 10:03:06

标签: matlab

如果我有一个数组UTC,我想查找非唯一条目列表:[1 2 3 4 3 5 6 7 8 7]。我找不到一个简单的方法来做到这一点。有什么想法吗?

更新:我希望有一个通用的解决方案,它也适用于字符串的单元格数组。

5 个答案:

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

使用uniquehistc -

的一种方法
[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)

使用sortdiff的另一种方法:

As = sort(A);
out = unique(As([false diff(As)==0]));