2017-01-11 25 views
7

Dzisiaj byłem dość zaskoczony przez to:Zaskoczony „niespójne” zachowania funkcji rankingu Matlaba na małych, Integer wycenione matryc

>> M = [0, 0, 0;6, 1, 3;1, 7, 0]; 
>> rank(M) 

ans = 

    3 

>> rank(M') 

ans = 

    2 

Zdaję sobie sprawę z faktu, że funkcja Ranking niekoniecznie numerycznie stabilny, ponieważ progu wartości pojedynczej. Spodziewałem się jednak, że pojawią się problemy z macierzami o dużych rozmiarach lub dużych elementach, a nie o macierzach 3 na 3 małych liczb całkowitych.

Sprawdziłem, co się dzieje i faktycznie svd (M) podaje wartości jednostkowe 7,82, 5,93, 2,91e-15, podczas gdy domyślna tolerancja to tylko max (rozmiar (A)) * eps (max (s)) = 2,665 e-15. Z drugiej strony, svd (M ') daje 0 jako trzecie wartości liczby pojedynczej (prawdopodobnie z powodu całej kolumny wynoszącej zero).

Oczywiście mogę ręcznie zwiększyć tolerancję w rankingu połączeń, ale skąd mam wiedzieć, jak daleko ją zwiększyć?

Czy istnieje inna stabilna liczbowo metoda obliczania rangi (powiedzmy, że wiemy, że macierz jest liczbą całkowitą)?

edycja: Właśnie stwierdziłem, że to zachowanie zależy od wersji. Powyższy test został przeprowadzony z Matlab 2014a. Na Matlab 2016b svd (M) zwraca trzecią wartość w liczbie pojedynczej jako 4,15e-16, a pozycja działa poprawnie. Być może rzeczywiście był problem z svd, który został rozwiązany między wersją. Nadal nie jestem już pewien, jak daleko mogę zaufać rangi, więc uważam, że moje pytanie pozostaje aktualne.

+1

sam efekt, jak masz w 2014b, na płycie. –

+0

Na R2016b, 'cond (M)' daje '5.046e15' i' cond (M. ') 'Daje' inf'. Zarówno 'Rank (M)' i 'Rank (M.)' '2' –

+0

dać na moim komputerze dyr (M) daje 1.884e16 w R2016b i 2.69e15 w R2014a. Oprócz wersji może to być zależne od platformy. Wspaniały. – Florian

Odpowiedz

1

Matlab 2015a/2015b wydają się działać (patrz niżej)

>> M = [0, 0, 0;6, 1, 3;1, 7, 0]; 
>> rank(M) 

ans = 

    2 

>> rank(M') 

ans = 

    2 

>> 
+0

Dzięki, więc zgodnie z danymi, zostało to ustalone między 2014b a 2015a. – Florian