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.
sam efekt, jak masz w 2014b, na płycie. –
Na R2016b, 'cond (M)' daje '5.046e15' i' cond (M. ') 'Daje' inf'. Zarówno 'Rank (M)' i 'Rank (M.)' '2' –
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