Find n minimum values in an array?

62 visualizaciones (últimos 30 días)
ME
ME el 15 de Abr. de 2015
Comentada: Chris Volpe el 1 de Feb. de 2023
I have an array, I need to be able to select 2, or 4 or so on 'n' minimum (smallest) values from the specific array? I know i can use 'min' function but this only gives one smallest value. I do not want to sort the array in order and pick values. is there another way ?????
  3 comentarios
Margarida Costa
Margarida Costa el 22 de En. de 2017
And is there an easy way to get back the indexes of those values?
Nicholas Ayres
Nicholas Ayres el 21 de Ag. de 2020
The "optional second output" of sort is the index order.
[sortedVals,indexes] = sort(myvals);
So
myVals = [1 0.1 7 10 4];
[sortedVals,indexes] = sort(myVals);
gives
sortedVals = [0.1 1 4 7 10]
indexes = [2 1 5 3 4]
Figured I'd pop this here in case anyone else comes along with the same question. :)

Iniciar sesión para comentar.

Respuesta aceptada

Titus Edelhofer
Titus Edelhofer el 15 de Abr. de 2015
Hi,
if you don't want to sort, and n is not too large, you could remove the index, something like
x = rand(1000, 1);
n = 5;
val = zeros(n,1);
for i=1:n
[val(i),idx] = min(x);
% remove for the next iteration the last smallest value:
x(idx) = [];
end
Titus
  5 comentarios
Rik
Rik el 8 de Jul. de 2019
I know this is an old thread, but still:
Even replacing x(idx) with NaN instead of removing the entry doesn't really improve the speed. This might be dependent on the release and of the size of the input array.
zaid tahir
zaid tahir el 5 de Mzo. de 2021
@Titus Edelhoferthanks for the code. Helped make a very complex problem, very simple.

Iniciar sesión para comentar.

Más respuestas (4)

Jan
Jan el 23 de En. de 2017
While sorting is the best approach to get the data, you can easily obtain an unsorted result:
n = 2;
[xs, index] = sort(x);
result = x(sort(index(1:n)))
  1 comentario
Chris Volpe
Chris Volpe el 1 de Feb. de 2023
Seems to me you want to leave out the "sort" call in line 3:
result = x(index(1:n))

Iniciar sesión para comentar.


Salam Ismaeel
Salam Ismaeel el 30 de Ag. de 2018
use: mink() command for R2018a
https://www.mathworks.com/help/matlab/ref/mink.html
  3 comentarios
Bill Tubbs
Bill Tubbs el 22 de Jun. de 2020
This is the correct answer. Thanks!
Example:
>> X = [4 1 2 1 5 4 2];
>> [minValues, idx] = mink(X,3)
minValues =
1 1 2
idx =
2 4 3
Martin Vankát
Martin Vankát el 25 de Oct. de 2020
Thank you! This one helped.

Iniciar sesión para comentar.


Titus Edelhofer
Titus Edelhofer el 15 de Abr. de 2015
Editada: Titus Edelhofer el 15 de Abr. de 2015
Hi,
if it's not floating point but integers (so no problem with roundoff),you could do the following:
x = [1 3 2 4 1 3 5 4 1 3 1]
% find the first 2 min occurrences:
idxMin = find(x==min(x), 2, 'first')
This tells that the smallest value 1 is found at positions 1 and 5. Or are you looking for the n smallest values in the sense, you are looking for the smallest, the second smallest etc.? In this case the answer is simply
n = 2;
xs = sort(x);
% pick the n smallest:
xs(1:n)
Titus
  5 comentarios
Titus Edelhofer
Titus Edelhofer el 15 de Abr. de 2015
If this was what you were looking for, then please mark the question as answered ... Thanks, Titus
ME
ME el 15 de Abr. de 2015
not entirely, because i don't want to sort the array.

Iniciar sesión para comentar.


Luis Gomez
Luis Gomez el 30 de Ag. de 2022
Editada: Luis Gomez el 30 de Ag. de 2022
I do it like this,
% k miminum values of a matrix (return the position, not the value)
% not optimized: it just worked for my application.
a = magic(5)
a = 5×5
17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9
%Copy the original data
aa = a;
%Size of the matrix
[rows columns] = size(a);
%Select the k mininum values
k = 3;
k_mins = zeros(k,1); %to store solution (not really needed)
for i = 1: k
[m, I] = min(a(:));
a(I) = inf;
k_mins(i) = I;
end
k_mins
k_mins = 3×1
11 20 24
% to get the [i, j] usual matrix locations for ecah value within k_mins
% for instance, to get the "i,j" indices por first element of k_mins
% vector,
[i j] = ind2sub([rows, columns],k_mins(1))
i = 1
j = 3
%the value
aa(i,j)
ans = 1
  8 comentarios
Walter Roberson
Walter Roberson el 30 de Ag. de 2022
Why not mink()?
Rik
Rik el 30 de Ag. de 2022
@Walter, to be honest I always forget that function exists ever since it was introduced in R2017b.

Iniciar sesión para comentar.

Categorías

Más información sobre Matrix Indexing en Help Center y File Exchange.

Etiquetas

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by