2013-08-07 7 views
6

Szukałem znaleźć najbardziej efektywny sposób, aby znaleźć niezerowej minimum matrycy i znalazłem to na forum:Co polecenia A (~ A) naprawdę zrobić w Matlab

Niech dane będzie macierz A.

A(~A) = nan; 
minNonZero = min(A); 

Jest to bardzo krótki i skuteczny (przynajmniej w liczbie linii kodu), ale nie rozumiem, co się dzieje, gdy robimy to. Nie mogę znaleźć żadnej dokumentacji na ten temat, ponieważ nie jest to operation na macierzach takich jak +, -, \, ... byłaby.

Czy ktoś może mi wyjaśnić lub podać mi link lub coś, co może mi pomóc zrozumieć, co się dzieje? Dziękujemy!

+2

Po prostu sidenote na wypadek, gdybyś chciał zachować tę strukturę: 'min' wydaje się ignorować' Inf' bardziej efektywnie niż 'NaN' –

Odpowiedz

9

wykorzystuje logical indexing

~ Matlab jest NIE. W przypadku użycia w podwójnej tablicy znajduje wszystkie elementy równe zeru. np:

~[0 3 4 0] 

Wyniki w matrycy logicznej

[1 0 0 1] 

czyli jest to szybki sposób znaleźć wszystkie zerowe elementy

Więc jeśli A = [0 3 4 0] następnie ~A = [1 0 0 1] więc teraz A(~A) = A([1 0 0 1]) . A([1 0 0 1]) wykorzystuje logiczne indeksowanie aby oddziaływał tylko na te elementy, które są prawdziwe, więc w tym przypadku elementu 1 i elementu 4.

Wreszcie A(~A) = NaN zastąpi wszystkie elementy w które były równe 0 z NaN które min ignoruje, a więc znajdziesz najmniejszy element niezerowy.

3

Kod podałeś:

A(~A) = NaN; 
minNonZero = min(A); 

wykonuje następujące operacje:

  1. Utwórz logiczny indeks
  2. Zastosować indeks logicznego na A
  3. zmienić, przypisując NaN wartości
  4. Uzyskaj minimum wszystkich wartości, nie licząc NaN wartości

Należy zauważyć, że pozostawia to zmienioną A, która może być niepożądana. Ale co ważniejsze, ma to pewne nieefektywności, ponieważ spędzasz czas zmieniając A i być może nawet dlatego, że dostajesz minimum dużej matrycy. Dlatego można przyspieszyć (a nawet zmniejszyć o jedną linię), wykonując:

minNonZero = min(A(logical(A))) 

Zasadniczo masz teraz pominąć krok 3 i ewentualnie zmniejszona krok 4.

Ponadto wydaje się uzyskać dodatkowy mały przyspieszenie wykonując:

minNonZero = min(A(A~=0)) 

nie mam żadnego dobrego powodu, ale wydaje się, że krok 1 jest teraz zrobić bardziej efektywnie.

+0

Nie jestem pewien, ale możliwe, że' ~ A' jest wolniejsze niż 'A ~ = 0', ponieważ poprzedni rzutuje na 'logiczny', a następnie neguje. – Edric

+0

@Edric To naprawdę miałoby sens. Okazuje się jednak, że nie powinienem tego negować, a to, że bez negacji, jest wolniejsze. Zobacz mój zredagowany post. –

Powiązane problemy