Boost und inverse Matrix



  • Hallo Leute!

    Habe ein Problem mit Boost.
    Ich verstehe es nicht ganz wie das funktionieren soll und deshalb
    kommt auch nur lauter Mist beim Prg. heraus.
    Also als Input bekomme ich eine Matrix mit tt.tran_matrix
    und von der soll ich die Inverse berechnen.
    Mittels lu_factorize und lu_substitute in uBLAS sollte es funktionieren, aber leider weiß ich nicht wie. 😕

    Hier der Link zu boost:
    http://www.boost.org/doc/libs/1_42_0/libs/numeric/ublas/doc/matrix_expression.htm#matrix_operations

    Bitte um eure Hilfe. Habe leider noch nie zuvor mit Boost gearbeitet.

    Danke
    Luis



  • Was hast du denn bisher? zeig doch mal deinen Code 🙂



  • Naja, eigentlich habe ich den Code dazu ja vom Netz und habe gedacht ich kann ihn einfach einbauen, aber dafür sollte man halt alles verstehen wie boost arbeitet. Und da bin ich noch nicht dahinter gestiegen.

    [code]  permutation_matrix<> pm(matrix.size1());
      matrix<double> copiedMatrix = matrix<double>(matrix);
      lu_factorize(copiedMatrix,pm);
      matrix<double> inverseMatrix(identity_matrix<double>(copiedMatrix.size1()));
      lu_substitute(copiedMatrix,pm,inverseMatrix);[/code]
    

    Wäre halt zu einfach, wenn man den Code einfach einbaut und es funktioniert. 🤡 Weil die Inverse ja nur ein sehr kleiner Teil ist.
    Wie baue ich jetzt die tt.tran_matrix dazu ein?
    Was macht lu_factorize und lu_substitute mit meiner Matrix?

    Danke



  • s.luis schrieb:

    Mittels lu_factorize und lu_substitute in uBLAS sollte es funktionieren, aber leider weiß ich nicht wie. 😕

    Hier der Link zu boost:
    http://www.boost.org/doc/libs/1_42_0/libs/numeric/ublas/doc/matrix_expression.htm#matrix_operations

    Hallo Luis,

    willkommen im C++-Forum.

    Es gibt ein (leider undokumentiertes) Beispiel dazu. Wenn Du boost (1.42) heruntergeladen hast, findest Du unter <boost_1_42_0\libs\numeric\ublas\test\test_lu.hpp> das Invertieren einer Matrix. Ich habe es aber noch nie so ausprobiert.

    Gruß
    Werner



  • http://www.johndcook.com/blog/2010/01/19/dont-invert-that-matrix/

    Wenn's ohne Inverse geht, mach's ohne. Der verlinkte Artikel sagt warum.



  • Hallo!

    krümelkacker schrieb:

    http://www.johndcook.com/blog/2010/01/19/dont-invert-that-matrix/

    Wenn's ohne Inverse geht, mach's ohne. Der verlinkte Artikel sagt warum.

    Schöne wenn es ohne gehen würde, aber ich habe dann noch einiges vor mit der Inversen 😃

    Hallo Werner!
    Bin es wohl nicht mehr gewohnt in einem Forum so nett begrüßt zu werden 😃
    Danke für die Info, werde es mir mal genauer ansehen.

    Gruß
    Luis



  • Hallo Leute!

    Habe jetzt ein wenig mehr Druchblick, aber halt noch nicht den Vollen 😉

    cout << "tran matrix from main: " << tt.trans_matrix << endl;
     matrix3_t matrix = tt.transformation_matrix;		//arbeitskopie vom input
     //matrix inverse anfang
      permutation_matrix<> pm(matrix.size1());
      lu_factorize(matrix,pm);
      matrix3_t inverse_matrix;
      matrix3_t indentity_matrix;
      inverse_matrix<>(identity_matrix<>(matrix.size1()));
      lu_substitute(matrix,pm,inverse_matrix);
    

    Leider mag der gcc-Compiler die Zeile mit der indentity und der inversen_matrix nicht und ich weiß nicht warum.

    Danke für die Hilfe.
    Gruß
    Luis

    PS: ich glaub ohne boost wäre ich schon fertig :p



  • s.luis schrieb:

    Leider mag der gcc-Compiler die Zeile mit der indentity und der inversen_matrix nicht und ich weiß nicht warum.

    indentity_matrix ist ein Template-Type. Das kann gut gehen, muss es aber als Variablenname nicht. Nenne Deine Matrix-Variablen in ernie & bert um 😉

    Gruß
    Werner



  • Werner Salomon schrieb:

    indentity_matrix ist ein Template-Type. Das kann gut gehen, muss es aber als Variablenname nicht. Nenne Deine Matrix-Variablen in ernie & bert um 😉

    mag der gcc auch nicht, obwohl ich erni & bert besser finde 😃

    Folgende Fehlermeldung:

    100%] Building CXX object /task1b/CMakeFiles/task1b.dir/main.cpp.o
    /home/task1b/main.cpp: In function ‘void transformTexture(std::string, std::string, TextureTransformation)’:
    /home/task1b/main.cpp:83: error: expected primary-expression before ‘double’
    /home/task1b/main.cpp:83: error: expected `;' before ‘double’
    make[2]: *** [/task1b/CMakeFiles/task1b.dir/main.cpp.o] Fehler 1
    make[1]: *** [/task1b/CMakeFiles/task1b.dir/all] Fehler 2
    make: *** [all] Fehler 2

    Sagt Euch das was?

    Grüße die Füße
    Luis
    und den Bauch auch 🙂



  • Hallo Leute!

    permutation_matrix<> pm(matrix.size1());
      lu_factorize(matrix,pm);
      matrix3_t inverse;
      inverse.assign(identity_matrix<double>(matrix.size1()));
      lu_substitute(matrix,pm,inverse);
    

    Jetzt gibt mal der Compiler eine Ruh, ob die Inverse richtig muss ich erst nachrechnen, aber der Anfang ist gemacht (nach zig Stunden)

    Gruß
    Luis



  • s.luis schrieb:

    Folgende Fehlermeldung:

    100%] Building CXX object /task1b/CMakeFiles/task1b.dir/main.cpp.o
    /home/task1b/main.cpp: In function ‘void transformTexture(std::string, std::string, TextureTransformation)’:
    /home/task1b/main.cpp:83: error: expected primary-expression before ‘double’
    /home/task1b/main.cpp:83: error: expected `;' before ‘double’
    make[2]: *** [/task1b/CMakeFiles/task1b.dir/main.cpp.o] Fehler 1
    make[1]: *** [/task1b/CMakeFiles/task1b.dir/all] Fehler 2

    Hallo Luis,

    zeige uns doch bitte auch die Zeile 83 und ein paar der Vorgängerzeilen. In Deinem ursprünglich geposteten Code kann diese Fehlermeldung nicht aufgetreten sein.
    .. schreibe bitte jeweils die Zeilennummer dazu.



  • Hallo Leute!!

    Ja das Teil funzt 😃 😃 😃
    *freu*
    Habe dafür eh lange bebraucht, aber ein kleiner Schritt ist getan.
    Ich glaube aber das war sicher nicht die letzte Frage zu dem Thema 🤡

    Danke
    Gruß
    Luis



  • Darf ich nochmal nachfragen, was du mit der Inversen machen möchtest? Weiter oben hat ja schonmal jemand darauf hingewiesen, dass man normalerweise die Inverse nicht explizit berechnen braucht. Ein Prof von mir hat mal das Theorem aufgestellt "Wer Matritzen berechnet ist doof". Stimmt natürlich nicht ganz in allen Lebenslagen, deswegen interessieren mich Anwendungen, wo man mal nicht doof bei der Inervertierung ist 🤡



  • Taurin schrieb:

    Darf ich nochmal nachfragen, was du mit der Inversen machen möchtest? Weiter oben hat ja schonmal jemand darauf hingewiesen, dass man normalerweise die Inverse nicht explizit berechnen braucht.

    Ich habe mal für einen movementtracker eine Kovarianzmatrix der Bewegungsabweichungen geschätzt. Diese musste ich dann invertieren um für beliebig viele Objekte die Mahanalobis Distanz zu berechnen (und die ist eben xTC(-1)x ). Die Alternative wäre gewesen, eine svd zu machen um die Eigenwerte zu kriegen und dann damit rumzufummeln. Aber da kann ich auch gleich invertieren. nimmt sich alles nichts.

    Ne andere Sache aus dem Projekt war die Inverse einer Kameramatrix um eine Rückprojektion eines Pixels (mit bekannten Entfernungsdaten) in den 3D-Raum zu vollführen - da das jeden Frame mit 10000 Pixeln gemacht wurde, hatte sich das schon gelohnt. Allerdings wars aber eher faulheit zu invertieren, weil wir alle Parameter hatten um die Inverse Matrix direkt zu berechnen. Aber 30 Zeilen Code vs 1...



  • otze schrieb:

    x^T C^(-1) x

    Was spricht dagegen, sich die LU-Zerlegung von C zu merken? Dann kannst Du "C^(-1) x" per Vorwärts- und Rückwärts-Substitution berechnen.



  • @krümelkacker
    Ist das schneller als eine Matrixmultiplikation einer 3x3 Matrix? Numerische Probleme konnten nämlich nicht auftreten



  • Die Inverse muss ich dann mit homogenen Koordinaten multiplizieren und dann wieder auf das kartesische System Rücktransformieren. Damit halt alle Transformationen von meinem Bild gemacht werden können.
    Da kommt man nicht so schnell weg von der Inversen, da man diese auf jedes Pixel anwendet!!

    Grüße
    Luis



  • Deine Matritzen haben eine Größe von 3x3 oder ähnlich klein? Dann ist eh alles egal 🙂 Da sollte es keine wesentlichen numerischen Probleme geben.



  • otze schrieb:

    @krümelkacker
    Ist das schneller als eine Matrixmultiplikation einer 3x3 Matrix? Numerische Probleme konnten nämlich nicht auftreten

    Das ist die gleiche Komplexitätsklasse, also O(n^2) bei einer n-kreuz-n Matrix.



  • Taurin schrieb:

    Deine Matritzen haben eine Größe von 3x3 oder ähnlich klein? Dann ist eh alles egal 🙂 Da sollte es keine wesentlichen numerischen Probleme geben.

    Ja aber nur mit diesem Input, es können jedoch andere Inputs kommen. Die müssen dann auch behandelt werden.


Anmelden zum Antworten