web-dev-qa-db-fra.com

Obtenez les indices des n plus grands éléments d'une matrice

Supposons que j'ai la matrice suivante:

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

Et je veux les indices des 5 premiers éléments (dans ce cas, 32, 13, 12, 11, 10). Quelle est la façon la plus propre de le faire dans MATLAB?

49
Vlad the Impala

Il existe plusieurs façons de procéder en fonction de la manière dont vous souhaitez gérer les valeurs répétées. Voici une solution qui trouve des indices pour les 5 plus grandes valeurs (qui pourraient inclure des valeurs répétées) en utilisant sort :

[~, 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

Voici une solution qui trouve les 5 plus grandes valeurs uniques , puis trouve toutes éléments égaux à ces valeurs (qui pourraient être supérieurs à 5 s'il y a des valeurs répétées), en utilisant unique et ismember :

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

Si vous avez un tableau assez grand et que vous n'en voulez que quelques éléments. Ce serait ma solution.

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

Je pense que cela devrait être plus rapide et moins RAM exigeant que la solution de tri.

16
Sebastian

Vous pouvez également trouver de bonnes réponses aux questions de matlab sur matlabcentral. J'ai trouvé une bonne implémentation mex en recherchant la même chose.

Il est réalisé par Bruno Luong à l'aide d'un algorithme de tri rapide partiel implémenté avec C-MEX. La complexité est O (n + k.log (k)), où n est la taille du tableau et k est le nombre d'éléments à sélectionner. Il est plus rapide que SORT ou un appel multiple de MIN/MAX pour des entrées de grande taille. Capacité multidimensionnelle prise en charge

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

7
seviyor

Dans MATLAB ≥ R2017b, vous pouvez utiliser maxk à cette fin spécifique.

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