2010-03-24 5 views
5

Jak wiadomo, przy wielu okazjach istnieje potrzeba oznaczania niektórych elementów macierzy. Na przykład, gdy mamy ważoną macierz sąsiedztwa, a nasz wykres nie jest w pełni połączony, musimy oznaczyć niektóre elementy, aby pokazać, że nie ma krawędzi między tymi węzłami. Pytanie brzmi, jak to zrobić? Czy lepiej jest umieścić NaN lub Inf na tych elementach w macierzy? lub coś innego (np. -1)?Jaki jest najlepszy sposób oznaczania niektórych elementów w programie MATLAB? używając NaN lub Inf? albo coś innego?

Odpowiedz

10

To całkowicie zależy od przypadku. W tym przykładzie dobrym rozwiązaniem może być użycie zer zer, ponieważ krawędzie są ważone, a dla wielu celów krawędź o wartości 0 równa jest zeru. To prawda, jeśli robisz takie rzeczy jak algorytmy przepływu/cięcia.

Ogólnie wybierając między NaN i Inf, wybrałbym NaN. Inf ma pewne właściwości, które nie mogą chcieć jako „nieważny” marker:

Inf*(-1) = -Inf 
Inf+(-Inf) = NaN 
Inf > 10 = True 
etc... 

Czysty rozwiązaniem może być zorganizowanie inny matrycy logicznych, że prawda ma gdzie połączenie jest poprawne i false w przeciwnym wypadku. To marnuje trochę pamięci, ale jeśli twoja macierz nie jest ogromna, myślę, że czytelność kodu, którą ci da, jest tego warta.

+3

NaN również pewne niespodzianki: NaN == NaN zwraca false! Dlatego zamiast używać funkcji isequal(), należy użyć funkcji isequalwithnans(). – Mikhail

+4

It's isequalwithequalnans() – Jonas

+2

To ma doskonały sens, że NaN == NaN jest fałszywe. zobacz na przykład: http://stackoverflow.com/questions/1843451/why-does-null-null-evaluate-to-false-in-sql-server. –

Powiązane problemy