2017-01-11 1 views
7

Heute habe ich ganz davon überrascht wurde stabil, da es die singulären Werte begrenzt. Ich habe jedoch erwartet, dass Probleme für Matrizen auftreten, die entweder groß oder groß in Elementen sind und nicht eine 3-mal-3-Matrix aus kleinen ganzen Zahlen.durch „inkonsistent“ Verhalten von Matlab-Rang Funktion Überrascht auf kleinen, ganzzahligen Matrizen

Ich überprüfte was passiert und in der Tat svd (M) gibt singuläre Werte 7.82, 5.93, 2.91e-15, während die Standardtoleranz nur max ist (Größe (A)) * eps (max (s)) = 2.665 e-15. Auf der anderen Seite gibt svd (M ') 0 als dritte Singulärwerte an (wahrscheinlich aufgrund einer ganzen Spalte, die Null ist).

Natürlich kann ich manuell die Toleranz in Calling Rank erhöhen, aber wie würde ich wissen, wie weit es zu erhöhen?

Gibt es eine andere numerisch stabile Methode, um den Rang zu berechnen (sagen wir, dass die Matrix eine ganze Zahl ist)?

bearbeiten: Ich habe gerade festgestellt, dass dieses Verhalten versionsabhängig ist. Der obige Test wurde mit Matlab 2014a durchgeführt. Bei Matlab 2016b gibt svd (M) den dritten Singularwert als 4.15e-16 zurück und der Rang funktioniert ordnungsgemäß. Also vielleicht gab es tatsächlich ein Problem mit SVD, das zwischen Version behoben wurde. Trotzdem bin ich mir nicht mehr sicher, wie weit ich dem Rang vertrauen kann, also glaube ich, dass meine Frage gültig bleibt.

+1

Gleichen Effekt wie Sie in 2014b, für die Aufzeichnung haben. –

+0

In R2016b gibt 'cond (M)' '5.046e15' und' cond (M. ') 'Gibt' inf'. Sowohl 'Rang (M)' und 'Rang (M.)' Geben '2' –

+0

Auf meinem Computer cond (M) 1.884e16 in R2016b und 2.69e15 in R2014a gibt. So kann es neben der Version auch plattformabhängig sein. Groß. – Florian

Antwort

1

Matlab 2015a/2015b scheint (siehe unten) zu arbeiten

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

ans = 

    2 

>> rank(M') 

ans = 

    2 

>> 
+0

Danke, so laut den Daten wurde dies zwischen 2014b und 2015a festgelegt. – Florian

Verwandte Themen