2012-02-07 46 views
1

目前,我正在運行一個腳本,使用排序來選擇k個最小值,但是當數據很大時它很慢。有什麼辦法來實現最小/最大隊列?

所以我想我只需要選擇k行基於給定矩陣與最小/最大隊列的某一列。有沒有辦法在MATLAB中做到這一點?

+0

我明白downvote可以發生,但你可以至少評論,所以我可以知道我的問題是什麼問題? – 2012-02-07 14:41:53

+2

你可以看看實現這裏列出的一些有效算法:http://en.wikipedia.org/wiki/Selection_algorithm。要實際實現超過MATLAB'sort'函數的性能,您可能必須生成優化的MEX函數,因爲m文件解決方案通常比編譯代碼慢得多。您還應該發佈現有的代碼。 – 2012-02-07 22:11:43

回答

2

我想過要找M最小值一個接一個,並在每次迭代後取出發現的最低值,但它的速度較慢,試試我的風向標:

elements = 1e4; 
runs = 20; 
numMin = 30; 
dat = rand(elements, 1); 

tic 
for i = 1:runs 
    d = sort(dat); 
    mins1 = d(1:numMin); 
end 
t1 = toc/runs 

tic 
for i = 1:runs 
    mins2 = zeros(numMin, 1); 
    d = dat; 
    for j = 1:numMin 
     [val, idx] = min(d); 
     mins2(j) = val; 
     d(idx) = []; 
    end 
end 
t2 = toc/runs 

isequal(mins1, mins2) 
+1

在這種情況下,c代碼和c/mex可以提供幫助,不是嗎? – 2012-02-07 15:25:25

+0

是的,他們真的可以,mex文件通常比內置的m腳本快得多,因爲它們需要被解釋 – tim 2012-02-07 20:35:48

2

我不知道的東西就像一個優先隊列是matlab原生的。 Matlab文件交換中有一個是 mex-file implementation,或者顯然你用Java來做 - 參見this question on stack overflowthis question on the Matlab forums

如果您經常需要插入和刪除列表中的元素,那麼這隻會對您有很大的幫助。如果您可以一次放入所有元素,並在最後排序,那可能與使用優先級隊列一樣快。這可能取決於你在做什麼的細節。

相關問題