Подтвердить что ты не робот

Получить индексы n наибольших элементов в матрице

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

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

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

4b9b3361

Ответ 1

Есть несколько способов сделать это в зависимости от того, как вы хотите иметь дело с повторяющимися значениями. Здесь найдено решение, которое находит индексы для 5 самых больших значений (которые могут включать повторяющиеся значения):

[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

Здесь решение, которое находит 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

Ответ 2

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

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

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

Ответ 3

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

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

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