Get the indices of the n largest elements in a matrix

前端 未结 4 1922
情书的邮戳
情书的邮戳 2020-11-27 15:46

Suppose I have the following matrix:

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

And I want the indices of the top 5 elements (in this

相关标签:
4条回答
  • 2020-11-27 16:38

    You can find good answers to matlab questions also on matlabcentral. I found a good mex implementation there while searching for the same thing.

    It is done by Bruno Luong using a partial quick-sort algorithm implemented with C-MEX. The complexity is O(n + k.log(k)), where n is the size of the array, and k is the number of elements to be selected. It is faster than SORT or multiple call of MIN/MAX for large size inputs. Multidimensional capability supported

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

    0 讨论(0)
  • 2020-11-27 16:39

    There are a couple ways you can do this depending on how you want to deal with repeated values. Here's a solution that finds indices for the 5 largest values (which could include repeated values) using sort:

    [~, 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
    

    Here's a solution that finds the 5 largest unique values, then finds all elements equal to those values (which could be more than 5 if there are repeated values), using unique and 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
    
    0 讨论(0)
  • 2020-11-27 16:43

    If you have a rather big array and only want a few elements out of it. This would be my solution.

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

    I think it should be faster and less RAM demanding than the sort solution.

    0 讨论(0)
  • 2020-11-27 16:46

    In MATLAB ≥ R2017b, you can use maxk for this specific purpose.

    [maxvalues, ind] = maxk(A(:), 5);
    
    0 讨论(0)
提交回复
热议问题