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?
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
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.
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
Dans MATLAB ≥ R2017b, vous pouvez utiliser maxk
à cette fin spécifique.
[maxvalues, ind] = maxk(A(:), 5);