获得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