2013-05-03 15 views
5

Czy istnieje skuteczny sposób na znalezienie m-tej najmniejszej liczby w wektorze o długości n w programie Matlab? Czy muszę używać funkcji sort()? Dziękuję i pozdrawiam!Znajdź najmniejszą liczbę w Matlab?

+0

Zobacz KTHVALUE na temat wymiany plików matlab: http://www.mathworks.com/matlabcentral/fileexchange/23195. Zobacz także wybór Min/Max: http://www.mathworks.com/matlabcentral/fileexchange/23576 –

+1

Nie jest to duplikat znajdowania wszystkich najmniejszych elementów. Zadanie to prawie zawsze wymaga sortowania, aby było wydajne, ale można to zrobić w liniowym czasie, zgodnie z poniższymi odpowiedziami. –

Odpowiedz

3

Edycja 2: Jak Eitan wskazał pierwszą część odpowiedzi nie rozwiązuje kwestię znalezienia najmniejszą wartość m-ty, ale w odniesieniu do elementu m-ty po wartości min. Reszta odpowiedzi pozostaje ... +1 za ostrość Eitana. Podczas gdy sort jest prawdopodobnie bardzo skuteczny na początek, możesz spróbować sprawdzić, czy lepiej będzie uzyskać find. Na przykład:

id=find(X>min(X),m,'first'); 
id(end) % is the index of the smallest m-th element in X 

funkcja find ma zwiększyć funkcjonalność, która pozwala odnaleźć „pierwszy” lub „ostatnie” elementy, które spełniają pewne kryteria. Na przykład, jeśli chcesz znaleźć pierwsze n elementy w tablicy X mniej niż wartość y użyć find(X<y,n,'first')

Ta operacja zatrzymuje się, jak tylko pierwszy element spełnienia warunku zostanie napotkany, który może doprowadzić do znacznych oszczędności czasu, jeśli tablica jest duża, a znaleziona wartość jest daleka od końca.

Chciałbym również, aby podsumować to, co powiedział już w @woodchips this SO discussion że jest dość istotne pytanie:

Najlepszym sposobem, aby przyspieszyć podstawowe algorytmy wbudowane, takie jak sortowanie jest uzyskanie szybszy sprzęt. Przyspieszy to również wszystko inne. MATLAB już to robi w wydajny sposób, wykorzystując wewnętrznie zoptymalizowany kod. Mówiąc to, może GPU dodatek może poprawić to zbyt ...

Edit: Na co warto, dodając do komentarza Muster, nie istnieje plik FEX nazywa nth_element że jest MEX okład z C++, który dostanie rozwiązanie w O(n) czasu na to, czego potrzebujesz. (Podobny do tego, co @DDD wskazał)

+0

Odnajduje pierwsze _m_ indeksy liczb, które są większe niż minimum, ale niekoniecznie zawierają one _m_-th najmniejszą liczbę, o co pyta się w pytaniu (może źle interpretuję to pytanie?) –

+0

cóż, w mojej odpowiedzi 'id (koniec)' jest indeksem najmniejszego m-tego elementu w X. Przyjąłem, że przejście od tego do uzyskania wartości 'X (id (koniec)) jest oczywiste. – bla

+0

Nie to miałem na myśli. Miałem na myśli, że _m_-th wartość w 'X', która jest większa niż' min (X) 'niekoniecznie jest _m_-th najmniejszą liczbą w' X'. Na przykład: weź 'm = 2' i' X = [9 9 1 2] '. Twoje rozwiązanie produkuje 9 i uważam, że poprawna odpowiedź to 2. –

1

Jako rozwiązanie alternatywne, można postępować w ten sposób:

A = randi(100,4000,1); 
A = sort(A,'ascend'); 
m = 5; % the 5 smallest numbers in array A 
B = A(1:5); 

Mam nadzieję, że to pomaga.

+0

OP szukał alternatyw dla tej metody. –

+0

@GuntherStruyf: OP zapytał: "czy muszę używać" sort "?" który nie implikuje bezpośrednio alternatywnych metod. – fpe

+0

Imo to oznacza, że ​​już wiedział, jak używać sortowania, co jest całkiem proste. –

Powiązane problemy