5

Matlabの長さnのベクトルでm番目に小さい数を見つける効率的な方法はありますか? sort() 関数を使用する必要がありますか? よろしくお願いします!

4

3 に答える 3

3

編集2:Eitanが指摘したように、答えの最初の部分は、最小のm番目の値を見つけるという問題に対処していませんが、最小値の後のm番目の要素に関するものです。残りの答えは残ります... エイタンの鋭さで+1。 はおそらく最初は非常にsort効率的ですが、a の方が優れているかどうかを試すことができfindます。例えば:

id=find(X>min(X),m,'first');
id(end) % is the index of the smallest m-th element in X

この関数findには、何らかの基準を満たす「最初」または「最後」の要素を見つける機能が追加されています。たとえばn、配列内Xの値より小さい最初の要素を見つけたい場合は、次yを使用します。 find(X<y,n,'first')

この操作は、条件を満たす最初の要素が検出されるとすぐに停止します。これにより、配列が大きく、見つかった値がたまたま最後から離れている場合に、時間を大幅に節約できます。

また、@woodchipsがこのSOディスカッションですでに言ったことを要約したいと思います。これは、あなたの質問に多少関連しています。

sort などの基本的な組み込みアルゴリズムを高速化する最善の方法は、より高速なハードウェアを入手することです。他のすべても高速化します。MATLAB は、内部で最適化されたコードを使用して、効率的な方法で既にそれを行っています。とは言っても、これもGPUアドオンで改善できるかも…。

編集: Musterのコメントに追加すると、必要なものに間に合うようにソリューションを取得するC ++のMEXラップであるnth_elementと呼ばれるFEXファイルがあります。O(n)(@DDDが指しているものに似ています)

于 2013-05-03T07:38:45.120 に答える
1

別の解決策として、次の方法に従うことができます。

A = randi(100,4000,1);
A = sort(A,'ascend');
m = 5; % the 5 smallest numbers in array A
B = A(1:5);

これが役立つことを願っています。

于 2013-05-03T10:51:30.867 に答える