获得matrix中n个最大元素的索引

假设我有以下matrix:

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

我想要的前五名(在这种情况下,32,13,12,11,10)的指数。 什么是最简洁的方式来做到这一点在MATLAB?

有几种方法可以做到这一点,取决于你想如何处理重复的值。 这里有一个解决scheme可以find5个最大值(可能包括重复值)的索引:

 [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 

这是一个解决scheme,find5个最大的唯一值,然后find所有元素等于这些值:

 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 

如果你有一个相当大的数组,只需要几个元素。 这将是我的解决scheme。

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

我认为它应该比sorting解决scheme更快,更less的RAM要求。

你也可以在matlabcentral上findmatlab问题的好答案。 在寻找相同的东西的时候,我发现了一个很好的mex实现。

这是Bruno Luong使用C-MEX实现的部分快速sortingalgorithm完成的。 复杂度为O(n + k.log(k)),其中n是数组的大小,k是要select的元素的数量。 对于大尺寸input,它比SORT或MIN / MAX多次调用要快。 支持多维能力

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