Find n minimum values in an array?

156 ビュー (過去 30 日間)
ME
ME 2015 年 4 月 15 日
コメント済み: Chris Volpe 2023 年 2 月 1 日
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 件のコメント
Margarida Costa
Margarida Costa 2017 年 1 月 22 日
And is there an easy way to get back the indexes of those values?
Nicholas Ayres
Nicholas Ayres 2020 年 8 月 21 日
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. :)

サインインしてコメントする。

採用された回答

Titus Edelhofer
Titus Edelhofer 2015 年 4 月 15 日
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 件のコメント
Rik
Rik 2019 年 7 月 8 日
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 2021 年 3 月 5 日
@Titus Edelhoferthanks for the code. Helped make a very complex problem, very simple.

サインインしてコメントする。

その他の回答 (4 件)

Jan
Jan 2017 年 1 月 23 日
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 件のコメント
Chris Volpe
Chris Volpe 2023 年 2 月 1 日
Seems to me you want to leave out the "sort" call in line 3:
result = x(index(1:n))

サインインしてコメントする。


Salam Ismaeel
Salam Ismaeel 2018 年 8 月 30 日
use: mink() command for R2018a
https://www.mathworks.com/help/matlab/ref/mink.html
  3 件のコメント
Bill Tubbs
Bill Tubbs 2020 年 6 月 22 日
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 2020 年 10 月 25 日
Thank you! This one helped.

サインインしてコメントする。


Titus Edelhofer
Titus Edelhofer 2015 年 4 月 15 日
編集済み: Titus Edelhofer 2015 年 4 月 15 日
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 件のコメント
Titus Edelhofer
Titus Edelhofer 2015 年 4 月 15 日
If this was what you were looking for, then please mark the question as answered ... Thanks, Titus
ME
ME 2015 年 4 月 15 日
not entirely, because i don't want to sort the array.

サインインしてコメントする。


Luis Gomez
Luis Gomez 2022 年 8 月 30 日
編集済み: Luis Gomez 2022 年 8 月 30 日
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 件のコメント
Walter Roberson
Walter Roberson 2022 年 8 月 30 日
Why not mink()?
Rik
Rik 2022 年 8 月 30 日
@Walter, to be honest I always forget that function exists ever since it was introduced in R2017b.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeLogical についてさらに検索

タグ

Community Treasure Hunt

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

Start Hunting!

Translated by