2015-05-15 18 views
0

我可能會用Matlab生鏽一點,也許這個問題的答案比我現在想象的更微不足道。不過,我已經在網上搜索有效的解決方案,我還沒有找到任何,所以我會在這裏嘗試。數組每列中的唯一元素(Matlab)

我有一個大的矩陣,像ÿ這裏:

N = 1e6; k = 20; n = 100; 
y = ceil(n * rand(k, N)); 

因爲我想算獨特的元素數量的陣列的每列。該循環非常緩慢:

tic 
r = zeros(N, 1); 
for ii = 1:N 
    r(ii) = numel(unique(y(:, ii))); 
end 
toc 

尋找矢量化,更快的版本。


大衛的答案似乎是正確的和快。謝謝!

N = 1e6; k = 20; n = 100; 
y = ceil(n * rand(k, N)); 

tic 
r1 = zeros(N, 1); 
for ii = 1:N 
    r1(ii) = numel(unique(y(:, ii))); 
end 
toc 

tic 
r2 = sum(diff(sort(y)) ~= 0) + 1; 
toc 

all(r1' == r2) 

回答

5

試試這個

sum(diff(sort(y))~=0)+1 

它使用做vectorise功能。對於你的情況,性能似乎比你的for循環更好,但是我會想象更大的問題,由於內存限制,我提出的解決方案會變得更糟。

隨着N=1e5,你的方法在我的電腦上花費約7.5秒,我的建議花費約0.05秒。與N=1e6,時間約爲75s和〜0.75s。

+0

'diff'和'sort' for'unique' ..聰明!!! –

+0

太糟糕了,不能做這樣的事情。 –

+1

@SanthanSalai'獨一無二'有效地做到了這一點,它只是沒有考慮到這種類型的事情。它't = sort(y)'然後'find(t(1:end-1)〜= t(2:end))',但沒有設置處理像這樣的矩陣。 – David

相關問題