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 912 times, 1 visits today)

Dodaj komentarz

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