Boost und inverse Matrix
-
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_operationsHallo 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ß
LuisPS: 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 2Sagt 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 2Hallo 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 ThemaDanke
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 auftretenDas 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.
-
krümelkacker schrieb:
otze schrieb:
@krümelkacker
Ist das schneller als eine Matrixmultiplikation einer 3x3 Matrix? Numerische Probleme konnten nämlich nicht auftretenDas ist die gleiche Komplexitätsklasse, also O(n^2) bei einer n-kreuz-n Matrix.
Hallo!
Würde ich so nicht unterschreiben!
Bei der einfachen Schulmethode geht es nur mit O(n^3).
Bei der Strassenmethode gehts mit Ω^2.
Ich glaube die schnellste Methode geht zur Zeit mit O(n^2,376)und das ist die Strassenmethode, welche aber nur bei großen Matrizen eingesetzt wird.Luis
-
s.luis schrieb:
krümelkacker schrieb:
otze schrieb:
@krümelkacker
Ist das schneller als eine Matrixmultiplikation einer 3x3 Matrix? Numerische Probleme konnten nämlich nicht auftretenDas ist die gleiche Komplexitätsklasse, also O(n^2) bei einer n-kreuz-n Matrix.
Würde ich so nicht unterschreiben!
Bei der einfachen Schulmethode geht es nur mit O(n^3).
...Ja, das Berechnen der Inverse bzw das Faktorisieren an sich ist aufwändiger. Es ging aber oben um das Wiederverwenden der inversen Matrix bzw der Faktorisierung.
-
s.luis schrieb:
Ich glaube die schnellste Methode geht zur Zeit mit O(n^2,376)und das ist die Strassenmethode, welche aber nur bei großen Matrizen eingesetzt wird.
Nein, das ist der Coppersmith–Winograd Algorithmus. Strassen hat O(n^2,807).