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ć.