Matlab独特的替代品

时间:2014-09-16 20:13:48

标签: matlab

我试图在Matlab中的短矢量中标记重复数字的实例。例如,在以下情况下:

A = [1 2 3 1 5 6 7 8] B = [1 2 3 4 5 6 7 8]

由于双倍1,A会标记为真,而B则不会。

将矢量与唯一(矢量)进行比较似乎是一个明显的答案,对于少数情况它是可以的,但是当您使用它100000次时,独特的功能证明非常慢!

对快速测试的想法?

3 个答案:

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