2014-01-11 39 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