假设我有以下矩阵:
01 02 03 06
03 05 07 02
13 10 11 12
32 01 08 03
我想要前5个元素的索引(在这种情况下,32,13,12,11,10)。在MATLAB中最干净的方法是什么?
答案 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个),使用unique
和ismember
:
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);