2013-07-01 132 views

回答

3

我建議使用unique命令。它將返回所有唯一值的值。

如果你要檢查你的矩陣v所有值都是唯一的,我會用下面的命令:

everything_is_unique = length(unique(v))==length(v); 

您也可以返回相同元素的索引。 有關更多信息,請參閱the documentation on unique

+1

你的意思是'everything_is_unique = length(unique(v))== length(v); ?因爲你比較了矢量和標量。 – Adiel

2

交替使用獨特的,你也可以將元素進行排序,並檢查它們是否是完全不同的:

all(diff(sort(v))) 

通過使用更多的輸入arguements排序,你可以得到你所尋找的指標。

+0

請注意,對於短向量,這應該優於循環。對於很長的一個循環可能會更快。 –

2

我會再給出一個解決方案,並比較迄今爲止嘗試過的所有方法。

我的解決方案基於以下觀察結果:使用內置函數(如sort()unique())時,您失去了提前逃脫的機會。也就是說,sort()必須在完成之前對矢量進行排序,然後才能繼續使用算法,即使在sort內已經檢測到兩個相等的值時不需要這樣做。

因此,我只需遍歷數組,然後使用any()將當前值與以下所有值進行比較。這可以解決其中的一些問題,並且對於很多情況來說運作良好。

然而,最壞的情況下複雜度爲O(N²),這是差了很多比sort()地獄,它只有O(N·日誌(N))。所以,像往常一樣,這一切都取決於上下文:)

嘗試這樣的:

clc 

N = 1e4; 

% Zigzag's solution 
tic 
for ii = 1:1e2 
    v = randi(N, N,1); 
    length(unique(v))==length(v); 
end 
toc 


% Dennis Jaheruddin's solution 
tic 
for ii = 1:1e4 
    v = randi(N, N,1); 
    all(diff(sort(v))); 
end 
toc 

% My solution 
tic 
for ii = 1:1e4 
    v = randi(N, N,1); 
    cond = true; 
    for jj = 1:numel(v) 
     if any(v(jj) == v(jj+1:end)) 
      cond = false; 
      break; 
     end 
    end 
end 
toc 

的隨機數的環內產生,以確保各種不同的情況下會通過。結果我的電腦:

Elapsed time is 16.787976 seconds. % unique 
Elapsed time is 14.284696 seconds. % sort + diff 
Elapsed time is 5.376655 seconds. % loop + any 

這麼露骨循環(提供feature accel上)與早期出口比標準的「量化」的做法:)

PS更快實際上幾乎三倍 - 我也試圖巢另一個循環,試圖提高其檢測值相等之前比較所有值(第一v(jj)==v(jj+1:end)完全評估之前any()可以開始做自己的工作),但在這裏,開銷真正開始的方式獲得(或JIT對這種薄弱環節的處理不夠好克,我不知道)。從理論上講,這應該是更快,當然,但不幸的是,不是在MATLAB :)

然而,隨機數生成

v = randi(N, N,1); 

變成

v = randi(N*N, N,1); 

,結果是相當不同的:

Elapsed time is 0.162625 seconds. % unique 
Elapsed time is 0.147369 seconds. % sort + diff 
Elapsed time is 30.767247 seconds. % loop + any 

這裏我只用了100次迭代而不是10.000,原因很明顯s :)

相關問題