2012-02-07 9 views
1

現在、k最小値を選択するためにsortを使用してスクリプトを実行していますが、データが大きい場合はかなり遅いです。最小/最大キューを実装する方法はありますか?

だから私は、最小/最大キューを持つ特定の行列の特定の列に基づいてk行だけを選択する必要があると思います。 MATLABでこれを行う方法はありますか?

私のベンチマークを試してみてください、私は M最小値を1つずつ発見し、各反復後に発見された最小値を除い考えたが、それは遅くなります
+0

私はdownvoteが発生する可能性があることを理解していますが、少なくとも私の質問に間違っていることが分かるようにコメントすることができますか? –

+2

http://en.wikipedia.org/wiki/Selection_algorithmで説明されている効率的なアルゴリズムの実装を見てみることができます。 MATLABの 'sort'関数を超えるパフォーマンスを実際に達成するには、おそらく最適化されたMEX関数を生成する必要があります。通常、mファイルソリューションはコンパイルされたコードよりもはるかに遅いためです。また、既存のコードを投稿する必要があります。 –

答えて

2

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は助けてくれるでしょうか? –

+0

はい、実際には可能です。mexファイルは、解釈が必要なため、ビルドインmスクリプトよりもはるかに高速です – tim

2

私は優先順位のような何かを知りませんmatlabにネイティブなキュー。 Matlabファイル交換で mex-file implementationが1つあります。または、明らかにJavaを使用しています - this question on stack overflowthis question on the Matlab forumsを参照してください。

あなたのリストの要素を頻繁に挿入したり削除したりする必要がある場合は、これは多くの場合に役立ちます。すべての要素を一度に配置し、最後に並べ替えることができるのであれば、優先順位キューを使用するのと同じくらい速いかもしれません。おそらくあなたがしていることの詳細に依存しています。

関連する問題