次のマトリックスがあると仮定します。
01 02 03 06
03 05 07 02
13 10 11 12
32 01 08 03
そして、上位5つの要素(この場合は32、13、12、11、10)のインデックスが必要です。 MATLABでこれを行う最もクリーンな方法は何ですか?
繰り返し値を処理する方法に応じて、これを行うことができるいくつかの方法があります。 sort
を使用して、5つの最大値(繰り返し値を含む可能性がある)のインデックスを検索するソリューションを次に示します。
[~, sortIndex] = sort(A(:), 'descend'); % Sort the values in descending order
maxIndex = sortIndex(1:5); % Get a linear index into A of the 5 largest values
5つの最大unique値を見つけてから、allを見つけるソリューションを次に示します。 unique
および ismember
を使用して、これらの値に等しい要素(値が繰り返される場合は5を超える場合があります):
sortedValues = unique(A(:)); % Unique sorted values
maxValues = sortedValues(end-4:end); % Get the 5 largest values
maxIndex = ismember(A, maxValues); % Get a logical index of all values
% equal to the 5 largest values
かなり大きな配列があり、その中のいくつかの要素のみが必要な場合。これが私の解決策です。
Arraycopy = Array;
for j = 1:n
[a, Index(j)] = max(Arraycopy);
Arraycopy(Index(j)) = -inf;
end
maximumValues = Array(Index);
ソートソリューションよりも高速で、要求の少ないRAM.
Matlabcentralでも、matlabの質問に対する適切な回答を見つけることができます。私は同じものを探している間に、良いメックス実装を見つけました。
これは、C-MEXで実装された部分的なクイックソートアルゴリズムを使用して、ブルーノルオンによって行われます。複雑さはO(n + k.log(k))です。ここで、nは配列のサイズ、kは選択される要素の数です。大きなサイズの入力の場合、SORTまたはMIN/MAXの複数呼び出しよりも高速です。サポートされる多次元機能
http://www.mathworks.com/matlabcentral/fileexchange/23576-minmax-selection
MATLAB≥R2017bでは、この特定の目的に maxk
を使用できます。
[maxvalues, ind] = maxk(A(:), 5);