获取矩阵中n个最大元素的索引

时间:2010-04-22 16:05:26

标签: matlab matrix

假设我有以下矩阵:

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

我想要前5个元素的索引(在这种情况下,32,13,12,11,10)。在MATLAB中最干净的方法是什么?

4 个答案:

答案 0 :(得分:77)

根据您希望如何处理重复值,有几种方法可以做到这一点。这是一个使用sort找到5个最大值(可能包括重复值)的索引的解决方案:

[~, 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个),使用uniqueismember

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

答案 1 :(得分:16)

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

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

我认为它应该比排序解决方案更快,更少RAM。

答案 2 :(得分:7)

你也可以在matlabcentral上找到matlab问题的好答案。我在搜索相同的东西时发现了一个很好的mex实现。

由Bruno Luong使用C-MEX实现的部分快速排序算法完成。复杂度为O(n + k.log(k)),其中n是数组的大小,k是要选择的元素的数量。对于大尺寸输入,它比SORT或MIN / MAX的多次调用快。支持多维功能

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

答案 3 :(得分:3)

在MATLAB≥R2017b中,您可以将maxk用于此特定目的。

[maxvalues, ind] = maxk(A(:), 5);