matrix inversion



  • so wie oben verlinkt...



  • Danke, hab die Beiträge bei meiner Antwort noch nicht gesehen...
    Ich werds versuchen.



  • Das brauchst du aber nicht selber machen, denn jede entsprechende Bibliothek bietet dir das...



  • sum_pattern schrieb:

    Ach ja!? [...]
    Wie sieht dann die bessere/einfachere Lösung aus?

    Je nachdem, was A für eine Matrix ist. Im allgemeinen Fall über die LR-Zerlegung (auf Englisch: LU factorization) mit Pivotisierung. Eigen kann das (und vieles mehr) z.B. schon.



  • So, nochmals danke für die Hilfe.
    Habe das Verfahren vorher leider noch nicht gekannt. Aber sieht gut aus. Werde das nun mit Hilfe von Eigen ausprobieren.
    Eine Frage noch: Da kann ich dann auch ohne Probleme mit komplexen Zahlen rechen / rechnen lassen?


  • Mod

    sum_pattern schrieb:

    So, nochmals danke für die Hilfe.
    Habe das Verfahren vorher leider noch nicht gekannt.

    Und dein Prof etwa auch nicht? 😮

    Aber sieht gut aus. Werde das nun mit Hilfe von Eigen ausprobieren.
    Eine Frage noch: Da kann ich dann auch ohne Probleme mit komplexen Zahlen rechen / rechnen lassen?

    Ich kenne zwar jetzt Eigen nicht, aber bei den anderen Matrixbibliotheken die ich kenne, ist das sogar Standard.



  • Dem Ganzen liegen irgendwelche Thesen eines Amerikaners von vor 30 Jahren zu Grunde. Der hat eben soweit ich weiss mit Inversen gerechnet und deshalb war ich (und der Prof) auf dem Trichter. Wie gesagt ich kannte die andere Variante auch gar nicht... Dem Prof unterstell ich das aber nicht 😉



  • Also bei uns war das so ziemlich das erste, was man am Anfang jedes Kurses, der sich irgendwie mit dem lösen von Gleichungssystemen zu tun hat, hatten.
    Vor allem auch um uns klar zu machen, dass man die Inverse einer Matrix eigentlich nie wirklich braucht und in realen Einsatzgebieten (Numerik) keine Inversen dazu gibt und wenn doch wäre es viel zu aufwändig die zu finden.
    Uns wurde richtiggehend eingebleut: Inverse haben wollen = böse (in Herleitungen für Techniken natürlich völlig Ok, aber wehe jemand will die dann auch berechnen) 😉



  • boost.uBLAS bietet out-of-the-box z.B. gar keinen Weg um eine inverse zu berechnen...



  • dot schrieb:

    boost.uBLAS bietet out-of-the-box z.B. gar keinen Weg um eine inverse zu berechnen...

    Das Selbe gilt aber auch für das direkte lösen von Gleichungssystemen.

    Ich vermute, das Argument zieht deshalb nicht.

    Ab und zu sind Inversen übrigens ganz toll knorke.



  • Mein erster post:

    sum_pattern schrieb:

    hab mir von Techsoft die MATRIX TCL LITE geholt
    [...]
    Allerdings möchte ich zum Teil auch komplexe Elemente in die Matrix mit eingeben.
    In "matdemo2" war so ein Beispiel mit nem komplexen Vektor
    [...]

    Das Beispiel war zum Lösen von A*x=b mit Hilfe der LR-Zerlegung, und komplexe Werte kann man da genauso benutzen.
    Genau das was ich gesucht habe! Nur hab ich das im ersten Moment nicht geschoben, weil mir ja auch die Methode noch neu war.
    Also, danke für eure Hilfe!!!
    Das Forum ist top. Wenns nochmal hakt, werd ich mich nochmal melden, aber hoffe euch nicht weiter belasten zu müssen 😉
    Bis dann.



  • Ich bins nochmal.

    Ich bin soweit fertig mit meinem Programm.
    Dabei habe ich den Header matrix.h von hier http://www.techsoftpl.com/matrix/index.htm benutzt.
    Ich hoffe jemand hat damit schonmal zu tun gehabt!?
    Ich habe den header also in meinen Code inkludiert und dann noch folgendes hinzugefügt (das hab ich einfach aus dem Beispiel von techsoft so übernommen):

    #include "matrix.h"
    #ifndef _NO_NAMESPACE 
    using namespace std;
    using namespace math;
    #define STD std
    #else
    #define STD
    #endif
    
    #if !defined(_NO_TEMPLATE)
    #  if defined(_MSC_VER)
    #     if _MSC_VER > 1000
    #        include <complex>
             typedef complex<double> type;
    #     else
             typedef double type;
    #     endif
    #  elif defined(__BORLANDC__)
    #     if defined(__WIN32__)
    #        include <complex>
             typedef complex<double> type;
    #     else
    #        include <complex.h>
             typedef complex type;
    #     endif         
    #  elif defined( __GNUG__ ) 
    #       include <complex>
            typedef complex<double> type;
    # elif defined( _SGI_BROKEN_STL )
    # include <complex>
    typedef std::complex<double> type;
    #  endif
      typedef matrix<type> Matrix;
    #else
       typedef matrix Matrix;
    #endif
    
    #ifndef _NO_EXCEPTION
    #  define TRYBEGIN()	try {
    #  define CATCHERROR()	} catch (const STD::exception& e) { \
                         cerr << "Error: " << e.what() << endl; }
    #else
    #  define TRYBEGIN()
    #  define CATCHERROR()
    #endif
    

    Mein Programm läuft, aber es treten "wegen dem header" 42 Warnungen auf.
    Bsp:
    38-mal kommt:

    warning C4290: C++-Ausnahmespezifikation ignoriert, es sei denn, es wird angezeigt, dass eine Funktion nicht __declspec(nothrow) ist
    

    2-mal:

    .cpp(195): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "math::matrix<T>".
    1>        with
    1>        [
    1>            T=type
    1>        ]
    

    2-mal:

    Bei der Kompilierung der  Klassen-template der math::matrix<T> math::matrix<T>::Solve(const math::matrix<T> &) throw(math::matrix_error) const-Memberfunktion
    1>        with
    1>        [
    1>            T=type
    1>        ]
    

    Kann mir da irgendjemand weiterhelfen, wie ich die Warnungen wegbekomme???



  • Keine Exception-Spezifikationen verwenden!



  • Was ist das denn überhaupt für ein Präprozessor-Rauschen? Tu Dir einen Gefallen und schmeiß das weg...

    Die Bibliothek macht auf mich keinen guten Eindruck. Nimm lieber Eigen.



  • Ich würde dir die MTL 4 (Matrix Template Library 4) empfehlen. Diese bietet Schnittstellen zu BLAS und LAPACK, wobei letzteres auch Routinen zur Matrixinversion und LU-Faktorisierung für dichtbesetzte Matrizen beinhaltet.

    Das ganze findest du auf http://www.simunova.com/node/135.

    Die Schreibweise ist der von Matlab sehr ähnlich und darum ist das ganze recht intuitiv zu benutzen.

    Du kannst zum Beispiel mit

    dense2D<double> invA( inv(A));
    

    Die Inverse der Matrix A berechnen und mit

    x = invA * b;
    

    den Lösungsvektor berechnen. Natürlich gibt es auch Vordefinierte Solver mit denen das schneller geht, aber bei einer 7*7-Matrix ist das eigentlich vollkommen Wurscht. Auf der Webseite gibts auch ein kleines Tutorial und eine Dokumentation alles Klassen.

    Ich nehme diese Bibliothek eigentlich immer wenn ich mit Matrizen arbeiten muss und ich hab immer das hinbekommen was ich wollte.

    Grüße

    Max


Anmelden zum Antworten