Matlab - 在列表中查找缺少的数字

时间:2014-01-11 20:04:00

标签: matlab

我有一个相对较大的数据集,我正在通过MatLab寻找丢失的数字。

例如,我有一个可能如下的数字列表:

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

你可以看到这里缺少8。该列表数以千计,可能只有几个缺失的数字。如何找出缺少哪些?我的搜索只显示有用的结果而没有随机重复数字。看似简单,但我无法弄清楚。

感谢您的帮助!

5 个答案:

答案 0 :(得分:3)

使用unique,如下所示:

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

C是您想要的缺失数字。

编辑(看到claj的回答):

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

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

EDIT2:(根据Eitan的评论)

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

此行替换原始答案中的两行。

答案 1 :(得分:2)

你可以这样做:

% 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);

然后确定'set'的哪些元素也在'data'中:

ismember(set, data)

然后输出显示缺少数据的'set'中的位置:

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

答案 2 :(得分: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

答案 3 :(得分:0)

在数组中创建unique值列表。

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

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

创建一个set difference的uniqued数组和范围集。

这会以适当快速的方式为您提供缺失的数字。

答案 4 :(得分:0)

这与上面的一些类似,但是我发现的最简单的是

find(~ismember(set,data))

将返回集合中不在数据中的成员的索引