web-dev-qa-db-ja.com

行列のn個の最大要素のインデックスを取得します

次のマトリックスがあると仮定します。

01 02 03 06
03 05 07 02
13 10 11 12
32 01 08 03

そして、上位5つの要素(この場合は32、13、12、11、10)のインデックスが必要です。 MATLABでこれを行う最もクリーンな方法は何ですか?

49
Vlad the Impala

繰り返し値を処理する方法に応じて、これを行うことができるいくつかの方法があります。 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
77
gnovice

かなり大きな配列があり、その中のいくつかの要素のみが必要な場合。これが私の解決策です。

Arraycopy = Array;
for j = 1:n
   [a, Index(j)] = max(Arraycopy);
   Arraycopy(Index(j)) = -inf;
end
maximumValues = Array(Index);

ソートソリューションよりも高速で、要求の少ないRAM.

16
Sebastian

Matlabcentralでも、matlabの質問に対する適切な回答を見つけることができます。私は同じものを探している間に、良いメックス実装を見つけました。

これは、C-MEXで実装された部分的なクイックソートアルゴリズムを使用して、ブルーノルオンによって行われます。複雑さはO(n + k.log(k))です。ここで、nは配列のサイズ、kは選択される要素の数です。大きなサイズの入力の場合、SORTまたはMIN/MAXの複数呼び出しよりも高速です。サポートされる多次元機能

http://www.mathworks.com/matlabcentral/fileexchange/23576-minmax-selection

7
seviyor

MATLAB≥R2017bでは、この特定の目的に maxk を使用できます。

[maxvalues, ind] = maxk(A(:), 5);
3
Sardar Usama