2014-01-11 37 views
1

我有一个相对较大的数据集,我正在通过MatLab查找缺少的数字。Matlab - 查找列表中缺失的数字

例如,我有可能看起来像数字列表:

1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 7, 7, 9, 10, 10.....

你可以看到8在这里失踪。该列表是在成千上万,也可能只是一对夫妇失踪的数字。我怎样才能找出哪些丢失?我的搜索只是有用的结果,没有随机重复的数字。似乎很简单,但我无法弄清楚。

感谢您的帮助!

回答

1

你可以做这样的事情:

% Your data: 
data = [1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 7, 7, 9, 10, 10]; 

for i = 1:data(end) 
    if (isempty(find(data==i))) 
     disp(['i = ',num2str(i)]); 
    end 
end 

这将打印出缺少的元素的值。


或者更简单的,你可以只使用ismember()函数来构造 在略低于单线差集。

% First enter your data and construct 'set': 
data = [1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 7, 7, 9, 10, 10]; 
set = data(1):data(end); 

然后,以确定哪些可以在“数据”的“设置”元素:

ismember(set, data) 

输出然后示出了数据丢失在“设定”位置:

ans = 
    1  1  1  1  1  1  1  0  1  1 
+0

谢谢,我用这个的成员,这是足以让我需要的东西。非常感激!!并感谢其他人的其他变化,我可以尝试添加到我的代码。 – User

+0

@用户,好吧,我添加了一个更简单的版本作为第二个选项,以防有用。 –

3

使用unique,像这样:

B=unique(A);  % A is your data 
C=setdiff(1:max(A),B) 

C是你想要的缺失数字。

编辑(afetr看到claj的答案):

如果你的数据从另一个值开始(而不是 “1”),第二行应该是:

C=setdiff(min(A):max(A),B) 

EDIT2:(根据Eitan的评论)

C=setdiff(min(A):max(A),A); 

这条线代替原来的答案的两行。

+1

我认为你可以管理没有独特的',*即*:'setdiff(1:max(A),A)' –

+0

@EitanT是的,我也这么认为......没有想到它。 – Adiel

0

在数组中创建一个unique值列表。

找到这个唯一集合中的最小和最大数字(这些数字应该与数组中的数字相同,但更快找到)。

创建从最小到最大的范围,如[min:max]

制作一个set difference的唯一阵列和范围集。

这给你在快速的方式缺少数字。

1

使用ismember()函数来检查,如果数目为数据阵列

% set your data array 
maximum = max(data); 
minimum = min(data); 

for i= minimum:maximum 

    if ~ismember(i,data); 
     disp([num2str(i) , ' is missed']); 
    end 

end