我有一个相对较大的数据集,我正在通过MatLab查找缺少的数字。Matlab - 查找列表中缺失的数字
例如,我有可能看起来像数字列表:
1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 7, 7, 9, 10, 10.....
你可以看到8在这里失踪。该列表是在成千上万,也可能只是一对夫妇失踪的数字。我怎样才能找出哪些丢失?我的搜索只是有用的结果,没有随机重复的数字。似乎很简单,但我无法弄清楚。
感谢您的帮助!
我有一个相对较大的数据集,我正在通过MatLab查找缺少的数字。Matlab - 查找列表中缺失的数字
例如,我有可能看起来像数字列表:
1, 1, 1, 2, 2, 3, 3, 3, 3, 4, 5, 5, 6, 6, 7, 7, 7, 7, 9, 10, 10.....
你可以看到8在这里失踪。该列表是在成千上万,也可能只是一对夫妇失踪的数字。我怎样才能找出哪些丢失?我的搜索只是有用的结果,没有随机重复的数字。似乎很简单,但我无法弄清楚。
感谢您的帮助!
你可以做这样的事情:
% 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
使用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);
这条线代替原来的答案的两行。
我认为你可以管理没有独特的',*即*:'setdiff(1:max(A),A)' –
@EitanT是的,我也这么认为......没有想到它。 – Adiel
在数组中创建一个unique值列表。
找到这个唯一集合中的最小和最大数字(这些数字应该与数组中的数字相同,但更快找到)。
创建从最小到最大的范围,如[min:max]
。
制作一个set difference的唯一阵列和范围集。
这给你在快速的方式缺少数字。
使用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
谢谢,我用这个的成员,这是足以让我需要的东西。非常感激!!并感谢其他人的其他变化,我可以尝试添加到我的代码。 – User
@用户,好吧,我添加了一个更简单的版本作为第二个选项,以防有用。 –