Rang einer Matrix



  • Hey hey,
    wir sollen den Rang einer Matrix berechnen lassen.
    Ich hab des jetzt mal mit m Gauss gemacht. ist aber zu ungenau und am liebsten würde ich eine vorabüberprüfung machen ob die Matrix n vollen Rang hat.

    Gibts noch andere Methoden die vielleicht genauer sind?

    Danke schonmal!
    82kolu



  • Tipp/Vorschlag:
    http://en.wikipedia.org/wiki/QR_decomposition#Column_pivoting

    Oder wenn's ganz genau gehen soll:
    http://en.wikipedia.org/wiki/Singular_value_decomposition

    (Die Berechnung einer solchen Singulärwertzerlegung ist aber mega-kompliziert. Das habe ich selbst im Mathestudium nicht gelernt. Do-It-Yourself ist eh meist eine schlechte Idee. Gerade bei mathematischen Dingen, die es schon hochoptimiert und super genau in fertigen Bibliotheken gibt. Auch beim Schreiben einer eigenen QR-Faktorisierung basierend auf Householdertransformationen kann man einiges falsch bzw ungeschickt machen und sich die Genauigkeit versauen.)



  • Also wenn ich das jetzt richtig verstanden hab (mein englisch 😛 )
    ist das einfach gauss mit Pivotsuche oder?

    du meintest es gibt schon optimierte sachen? gibts n befehl für rang in c++?
    ich benutze die boost bibliothek hab aber nix gefunden.

    Danke nochmal 😉



  • 82kolu schrieb:

    und am liebsten würde ich eine vorabüberprüfung machen ob die Matrix n vollen Rang hat.

    Ist der Rand nicht genau dann voll, wenn die Determinante ungleich 0 ist?

    82kolu schrieb:

    Hey hey,
    wir sollen den Rang einer Matrix berechnen lassen.
    Ich hab des jetzt mal mit m Gauss gemacht. ist aber zu ungenau

    Nur ein Bißchen ungenau oder haste Fließkommazahlen gegen 0 verglichen ohne fabs oder Konsorten?



  • Das mit der det ist richtig. Wenn die det = 0 dann ist der rang != n
    ansonsten voller Rang. Das hilft mir aber leider nicht. weil die Determinante kann man ja gleich im anschluss nachschauen nachdem man den rang berechnet hat. war auch ein grund warum ich das so gemacht habe.

    Mein Algorithmus soll immer gehen auch nahe 0...
    ich versteh nicht ganz was mir fas helfen soll? (betrag oder)
    und den anderen befehl kenn ich leider nicht. Was macht der?

    Danke!



  • volkard schrieb:

    Ist der Rand nicht genau dann voll, wenn die Determinante ungleich 0 ist?

    Mathematisch ja. Numerisch ist die Berechnung der Determinante für die Rangbestimmung mit das schlechteste, was man tun kann.



  • [quote="krümelkacker"]

    volkard schrieb:

    Mathematisch ja. Numerisch ist die Berechnung der Determinante für die Rangbestimmung mit das schlechteste, was man tun kann.

    und was ist ne numerisch gute methode (ausgenommen Singulärwertzerlegung)



  • 82kolu schrieb:

    und was ist ne numerisch gute methode (ausgenommen Singulärwertzerlegung)

    Siehe ersten von mir geposteten Link. Suchst Du nach "Rank (linear algebra)" bei Wikipedia findest Du sogar so einen Abschnitt:

    When applied to floating point computations on computers, basic Gaussian elimination (LU decomposition) can be unreliable, and a rank revealing decomposition should be used instead. An effective alternative is the singular value decomposition (SVD), but there are other less expensive choices, such as QR decomposition with pivoting, which are still more numerically robust than Gaussian elimination. Numerical determination of rank requires a criterion for deciding when a value, such as a singular value from the SVD, should be treated as zero, a practical choice which depends on both the matrix and the application.



  • 82kolu schrieb:

    ich versteh nicht ganz was mir fas helfen soll? (betrag oder)

    if(fabs(zahl)<1.e-6) nimm_an("zahl ist 0");
    

    ist manchmal hilfreich. Nicht mitten im Rechnen, die Annahme macht ja nur alles weitere ungenauer, da schubst man so eine Annahme lieber nach hinten. Aber bei der Auswertung, dem letztlichen Rangzählen, dem Determinantenprüfen, ja, da schon.
    Kann mir nicht vorstellen, daß der Prof als Testaufgaben Matrizen nimmt, die numerisch besonders ärgerlich sind.



  • volkard schrieb:

    if(fabs(zahl)<1.e-6) nimm_an("zahl ist 0");
    

    ist manchmal hilfreich. Nicht mitten im Rechnen, die Annahme macht ja nur alles weitere ungenauer, da schubst man so eine Annahme lieber nach hinten. Aber bei der Auswertung, dem letztlichen Rangzählen, dem Determinantenprüfen, ja, da schon.

    aber wenn ich von dem 1.e-6 darauf schließe das det = 0 => rang !=n obwohls es sein kann... hm leider ist genau das das problem... und daher unbrauchbar...
    Und andersherum auch schimm... rang gerundet != n => det =0 obwohl det eig. 2398 ist...

    aber danke für die Mühe!
    82kolu



  • 82kolu schrieb:

    aber wenn ich von dem 1.e-6 darauf schließe das det = 0 => rang !=n obwohls es sein kann...

    Das Problem ist, dass du immer einen numerischen Fehler hast. Und ja, je nach Verfahren, Art der Matrix und Datentyp kann der Fehler auch >1.e-6 sein.

    In praktischen Anwendungen ist es meist nicht so schlimm, wenn die numerisch instabilen Eigenwerte als 0 angenommen werden. (Insbesodnere ein Gauss wird bei solchen Eigenwerten echt instabil). Damit kann man leben. In der Tat würde ich es als schlimmer ansehen, den Rang als zu hoch einzuschätzen, wenn die Matrix nicht vollen Rang hat.


Anmelden zum Antworten