Abhishek Bhatia
Abhishek Bhatia

Reputation: 9796

Find top n elements in matrix

I have a matrix which contains values and I wish to find the index of the top n minimum values.

I use the following code for finding the minimum most value:

[r,c]=find(Result==min(min(Result)));

I cant find any other questions on stack overflow which answer the question, please help

Upvotes: 0

Views: 3343

Answers (3)

Luis Mendo
Luis Mendo

Reputation: 112659

Use prctile (Statistics Toolbox) to find the appropriate threshold, and then use indexing to select the elements above that threshold:

x = magic(4); %// example
n = 5; %// we want the top n elements
M = numel(x);
p = prctile(x(:), (M-n)/M*100);
indices = find(x>p); %// result in the form linear indices
[row, col] = find(x>p); %// result in the form of row and column indices

In this example:

>> x
x =
    16     2     3    13
     5    11    10     8
     9     7     6    12
     4    14    15     1
>> indices.'
ans =
     1     8    12    13    15
>> row.'
ans =
     1     4     4     1     3
>> col.'
ans =
     1     2     3     4     4
>> x(indices).'
ans =
    16    14    15    13    12

Example with repeated elements:

>> x = [1 1 2 5; 3 4 3 5];
>> n = 5;

gives

>> indices.'
ans =
     2     4     6     7     8
>> row.'
ans =
     2     2     2     1     2
>> col.'
ans =
     1     2     3     4     4
>> x(indices).'
ans =
     3     4     3     5     5

Upvotes: 1

Santhan Salai
Santhan Salai

Reputation: 3898

Or without Intersect in the other answer

[sorted,I] = sort(Result(:));
[r,c] = ind2sub(size(Result),I(1:10));  %//Change 10 to any other required value

Upvotes: 1

kkuilla
kkuilla

Reputation: 2256

Maybe you could do something like this:

sorted = sort(Result(:));
topten = sorted(1:10);
[~,ia,~] = intersect(Result(:),topten(:)); % // Get the indices of the top ten values
[r,c]=ind2sub(size(Result),ia); % // Convert the indices to rows and columns

Upvotes: 2

Related Questions