Предположим, что у меня есть следующая матрица:
01 02 03 06
03 05 07 02
13 10 11 12
32 01 08 03
И мне нужны индексы из 5 лучших элементов (в данном случае 32, 13, 12, 11, 10). Каков самый чистый способ сделать это в MATLAB?
Предположим, что у меня есть следующая матрица:
01 02 03 06
03 05 07 02
13 10 11 12
32 01 08 03
И мне нужны индексы из 5 лучших элементов (в данном случае 32, 13, 12, 11, 10). Каков самый чистый способ сделать это в MATLAB?
Есть несколько способов сделать это в зависимости от того, как вы хотите иметь дело с повторяющимися значениями. Здесь найдено решение, которое находит индексы для 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
Если у вас есть довольно большой массив и вам нужно только несколько элементов. Это было бы моим решением.
Arraycopy = Array;
for j = 1:n
[a, Index(j)] = max(Arraycopy);
Arraycopy(Index(j)) = -inf;
end
maximumValues = Array(Index);
Я думаю, что это должно быть быстрее и меньше оперативной памяти, чем решение сортировки.
Вы можете найти хорошие ответы на вопросы matlab также на matlabcentral. Я нашел хорошую реализацию mex там, ища то же самое.
Это выполняется Бруно Луонгом, используя алгоритм частичной быстрой сортировки, реализованный с помощью C-MEX. Сложность - O (n + k.log(k)), где n - размер массива, а k - количество элементов, которые нужно выбрать. Это быстрее, чем SORT или множественный вызов MIN/MAX для ввода большого размера. Поддержка многомерных возможностей
http://www.mathworks.com/matlabcentral/fileexchange/23576-minmax-selection