Matlabの長さnのベクトルでm番目に小さい数を見つける効率的な方法はありますか? sort() 関数を使用する必要がありますか? よろしくお願いします!
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が指しているものに似ています)
別の解決策として、次の方法に従うことができます。
A = randi(100,4000,1);
A = sort(A,'ascend');
m = 5; % the 5 smallest numbers in array A
B = A(1:5);
これが役立つことを願っています。