50 votes

Obtenir les indices des n plus grands éléments dans 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 dans le top 5 des éléments (dans ce cas, 32, 13, 12, 11, 10). Quelle est la façon la plus propre de faire cela dans MATLAB?

78voto

gnovice Points 70970

Il existe quelques façons dont vous pouvez faire ce en fonction de comment vous voulez traiter avec des valeurs répétées. Voici une solution qui trouve des indices pour les 5 valeurs les plus grandes (qui pourraient inclure des valeurs répétées):

[sortedValues,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 gros unique de valeurs, se retrouve alors tous les éléments égaux à ceux des valeurs:

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

16voto

Sebastian Points 99

Si vous avez un grand tableau et que vous souhaitez uniquement quelques éléments en dehors de ça. 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 qu'il devrait être plus rapide et moins de RAM exigeant que le type de solution.

7voto

seviyor Points 66

Vous pouvez trouver de bonnes réponses à matlab questions aussi sur matlabcentral. J'ai trouvé une bonne mex mise en œuvre, tandis que la recherche de la même chose.

Il est fait par Bruno Luong à l'aide d'un partiel de tri rapide de l'algorithme mis en œuvre avec le 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électionnés. Il est plus rapide que le TRI ou plusieurs appels de MIN/MAX pour la grande taille des entrées. Multidimensionnelle de la capacité de prises en charge

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X