我试图在Matlab中的短矢量中标记重复数字的实例。例如,在以下情况下:
A = [1 2 3 1 5 6 7 8] B = [1 2 3 4 5 6 7 8]
由于双倍1,A会标记为真,而B则不会。
将矢量与唯一(矢量)进行比较似乎是一个明显的答案,对于少数情况它是可以的,但是当您使用它100000次时,独特的功能证明非常慢!
对快速测试的想法?
答案 0 :(得分:3)
您可以进行以下测试。如果有重复的数字,则会输出1
,否则为0
。
(sum(diff(sort(A))==0))~=0
diff
函数从n
中减去位置n+1
的数字。如果您实际上可以编写一个执行相同操作的函数,但只是在找到零的第一个实例时返回1
,即重复的数字彼此相邻。可能你必须编写一个MEX函数来使它更快。 diff()
函数的缺点是,它将扫描整个向量,即使它已经满了重复的数字。
我喜欢@A下面评论中写的解决方案的变体。 Klomp的:
any(diff(sort(A))==0)
答案 1 :(得分:0)
有几种方法可以做到这一点。
1)您可以先对列表进行排序,然后检查是否有任何重复的数字,即[1,1,2,3,4 ..]
这是一个O(nlog(n))
算法,因为您必须对列表进行排序(希望使用合并排序或快速排序(应该内置)和贯穿它。
sort(list)
for( i =1:len(list))
if(i < len(list) -1 && list[i] == list[i+1]) return false;
end
2)你可以做一个O(n^2)
算法,你只需要在列表中强行交叉检查每个元素与另一个元素。基本上将自己与唯一列表进行比较,但不是将其与另一个列表进行比较,而是将其与自身进行比较。
例如:
for(i= 1:len(list))
for(j = 1:len(list))
if(list[i] == list[j]) return false;
end
end
答案 2 :(得分:0)
以下是一些替代方案。不确定它们是否比其他答案更快:
sum(sum(bsxfun(@eq, A, A.'))) > numel(A)
nnz(triu(bsxfun(@eq, A, A.'), 1))
any(sum(pdist(A(:))==0))
any(accumarray(A(:), 1) > 1)
nnz(sparse(A(:), 1, 1) > 1)