687 views (last 30 days)

Show older comments

Nicholas Ayres
on 21 Aug 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. :)

Titus Edelhofer
on 15 Apr 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

zaid tahir
on 5 Mar 2021

@Titus Edelhoferthanks for the code. Helped make a very complex problem, very simple.

Jan
on 23 Jan 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)))

Salam Ismaeel
on 30 Aug 2018

use: mink() command for R2018a

https://www.mathworks.com/help/matlab/ref/mink.html

Titus Edelhofer
on 15 Apr 2015

Edited: Titus Edelhofer
on 15 Apr 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

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

Start Hunting!