我有一个相对较大的数据集,我正在通过MatLab寻找丢失的数字。
例如,我有一个可能如下的数字列表:
1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 7, 7, 9, 10, 10.....
你可以看到这里缺少8。该列表数以千计,可能只有几个缺失的数字。如何找出缺少哪些?我的搜索只显示有用的结果而没有随机重复数字。看似简单,但我无法弄清楚。
感谢您的帮助!
答案 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))
将返回集合中不在数据中的成员的索引