find - najmniej użyteczna funkcja w MATLABie

find - najmniej użyteczna funkcja w MATLABie

Dziś parę słów o MATLABowej funkcji find. Funkcji, bez której można się najczęściej świetnie obyć, z czego wiele osób nie zdaje sobie sprawy.
Rozważmy następujący problem: W wektorze danych chcemy znaleźć element o największej wartości. Po jego zidentyfikowaniu należy usunąć go ze zbioru. Jak to zrobić? W zasadzie intuicyjnie narzuca się tutaj wykorzystanie funkcji max. Niestety intuicja nie podpowiada zazwyczaj, jak zrobić to w prawidłowy sposób.

% losowanie wektora danych
v = randi(20,1,10)
% wyznaczenie wartości maksymalnej
m = max(v)


v =


14 1 17 19 14 16 15 8 14 4


m =


19

Pozostało nam więc wyszukanie, w którym miejscu wektora v znajduje się element m.

idx = find(v == m);
v(idx) = [];

Można to zrobić w ten sposób, jednak nie ma to większego sensu. Indeks elementu potrafi wskazać nam funkcja max, należy tylko postarać się o zapisanie drugiego argumentu wyjściowego, jaki zwraca funkcja.

% wyznaczenie wartości maksymalnej
[m, idx] = max(v)

Co w przypadku, gdy nie szukamy wartości maksymalnej ani minimalnej, jak w takim przypadku można obyć się bez funkcji find? Bardzo łatwo. W zasadzie wystarczy w kodzie opuścić słowo find i powinno działać. Nieprawdopodobne? Sprawdźmy. W wektorze v wyszukajmy i wyświetlmy wszystkie elementy, które przyjmują wartość mniejszą od 5.

idx = find(v < 5)
v(idx)


ans=


1 4

No to teraz wersja nr 2, opuszczamy find

idx = (v < 5)
v(idx)


ans=


1 4

Rezultat jest dokładnie taki sam. Funkcja find niczego nie "szuka", wskazuje tylko, które elementy wejściowe wektora (macierz) są niezerowe. Ponieważ w MATLABie możemy korzystać z tzw. indeksowania logicznego, określenie indeksów poszukiwanych elementów nie jest najczęściej do niczego potrzebne.
Oczywiście, zdarzają się takie sytuacje,  kiedy funkcja find okaże się nieodzowna, jednak nie ma potrzeby jej nadużywać.

(Visited 1 100 times, 4 visits today)

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *