Получить индексы n самых больших элементов в матрице - PullRequest
49 голосов
/ 22 апреля 2010

Предположим, у меня есть следующая матрица:

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

И я хочу индексы 5 верхних элементов (в данном случае 32, 13, 12, 11, 10).Какой самый чистый способ сделать это в MATLAB?

Ответы [ 4 ]

77 голосов
/ 22 апреля 2010

Есть несколько способов сделать это в зависимости от того, как вы хотите работать с повторяющимися значениями.Вот решение, которое находит индексы для 5 самых больших значений (которые могут включать повторяющиеся значения), используя 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

Вот решение, которое находит 5 самых больших уникальных значений, затем находит всех элементов, равных этим значениям (которые могут быть больше 5, если есть повторяющиеся значения), используя unique и 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
16 голосов
/ 10 января 2012

Если у вас довольно большой массив и вы хотите использовать только несколько элементов. Это было бы моим решением.

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

Я думаю, что это должно быть быстрее и требует меньше оперативной памяти, чем решение для сортировки.

7 голосов
/ 29 января 2012

Хорошие ответы на вопросы Matlab можно найти и на matlabcentral. Я нашел хорошую реализацию mex там, ища то же самое.

Это сделано Бруно Луонгом с использованием алгоритма частичной быстрой сортировки, реализованного в C-MEX. Сложность O (n + k.log (k)), где n - размер массива, а k - количество элементов, которые нужно выбрать. Это быстрее, чем SORT или многократный вызов MIN / MAX для входов большого размера. Поддержка многомерных возможностей

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

3 голосов
/ 18 июля 2018

В MATLAB ≥ R2017b вы можете использовать maxk для этой конкретной цели.

[maxvalues, ind] = maxk(A(:), 5);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...