2013-04-11 113 views
2

我有一個非常大的矩陣(901x1801),它是通過組合三個相似數組的值(使用它們中的重複值)生成使用數學表達式的唯一代碼而生成的。矩陣填充了這些代碼。檢查一個大矩陣中的重複條目matlab

我的問題是...如何檢查矩陣(901x1801)的每個值是否是唯一的,甚至不會重複一次?

或... 誰能告訴我如何通過組合三個相似元素的數組來生成一個矩陣,每個生成的值都是唯一的。

早期回覆將會大受歡迎。 在此先感謝。

+4

你寫道你的矩陣「充滿了這些代碼」,有些東西不清楚,你的數組是否包含數字或字符串(表達式)? – bla 2013-04-11 17:39:05

+0

我想檢查的矩陣填充了用3個不同數組(數字)生成的代碼。我必須使用特定的數據陣列來生成這些唯一的代碼。我不能只使用隨機數字。 – Mushi 2013-04-11 18:05:29

回答

5

隨着大型矩陣M,讓所有的唯一值,使用:

uniqueValues = unique(M(:)); 

然後,以瞭解是否有任何重複的值,你可以使用:

repeatedValuesFound = numel(uniqueValues) ~= numel(M); 

也就是說,如果唯一值數組與原始數組具有相同數量的元素,則原始數組的所有元素都必須是唯一的。

+0

你不需要'M(:)'。唯一始終返回矢量。 – yuk 2013-04-11 18:04:55

+0

親愛的Pusuit,不幸的是我不得不使用特定的數據數組來生成這些獨特的代碼。我不能只使用隨機數字。但是,我的主要問題是檢查矩陣(901x1801)中的所有代碼是否唯一,而不是其他代碼的重複。檢查這麼大的陣列對我來說是個問題。 – Mushi 2013-04-11 18:08:07

+1

誰在使用隨機數字?這個'unique'函數應該適用於任何數字矩陣或字符串的單元數組。 – Pursuit 2013-04-11 18:36:24

3

要找到重複的M中的位置,使用下面的代碼:

V = M(:);       % flatten 
[Vs, Vi] = sort(V);     % sort, Vi are indices into V 
delta = Vs(2:end) - Vs(1:end-1); % delta==0 means duplicate 
dup1 = Vi(find(delta == 0));  % dup1 has indices of duplicates in V 
dup2 = Vi(find(delta == 0) + 1); % dup2 has the corresponding other 
            % rewrite to [row col] 
[dup1(:,1) dup1(:,2)] = ind2sub(size(M), dup1); 
[dup2(:,1) dup2(:,2)] = ind2sub(size(M), dup2); 

DUP1和DUP2的行現在包含在併購是重複的位置。