PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Ausgleichung mit grossen, dünn besetzten Matrizen


Hypothraxer
2011-02-18, 16:34:12
Guten Tag

Ich habe hier folgende Ausgangslage:

Es sind min. 2 Bilder, und die korrespondierenden Bildmessungen vorhanden. Das Ziel ist, die sechs unbekannten Orientierungsparameter der Bilder (je: X, Y, Z, Omega, Phi, Kappa) sowie die 3D Koordinaten der Bildmessungen via vermittelnder Ausgleichung auszugleichen (das gute, alte A^T P A * x = * A^T P l ).

Nun kommt das Problem: Jedes Bild bringt 6 Unbekannte mit. Jeder Objektpunkt 3.

Das heisst, dass die Normalgleichungsmatrize bei 2 Bildern und 6'000 Objektpunkten, 18'012 * 18'012 gross ist - allerdings ist sie nicht voll, sondern nur dünn besetzt.

Geht man auf etwas grössere Systeme los (z.B. 92 Bilder mit ~150'000 Punkten) so bläht sich die Normalgleichungsmatrize auf 505'200 * 505'200 auf.

Somit wollte ich fragen, ob jemand eine library empfehlen kann, die a) dünn besetzte Matrizen ausnutzen kann und b) die auch mit recht grossen Matrizen zurecht kommt.

b) ist insofern nicht ganz so schlimm - da ich im Notfall jeweils Bildtripletten ausgleichen und nachher mittels Transformation wieder aneinander ketten kann - es soll hier keine unglaublich genaue Ausgleichung sein - es dient lediglich der Approximation.


Bisher habe ich die GSL (Gnu Scientific Library) verwendet - die beherrscht aber keine dünn besetzten Matrizen (bzw. kann dies nicht speziell speichern), womit bei ~20'000 x 20'000 Matrizen Schluss ist.

Boost beherrscht dünn besetzte Matrizen, aber da ist, soweit ich das gesehen habe, bei 32'000x32'000 Schluss (auf 32-bit Systemen).

Intel's Math Kernel Library wäre auch verfügbar - habe ich bisher aber nicht genau angesehen, weil ich mit der Dokumentation nicht zurecht komme :( (Schon bei der IPP war das für mich ein Horror).

Pinoccio
2011-02-18, 16:40:36
Ist www.mathtools.net/C_C__/Sparse (http://www.mathtools.net/C_C__/Sparse/index.html) da was dabei?

mfg

Trap
2011-02-18, 17:36:56
Eine gute Liste mit numeric-Libs für LA: http://www.netlib.org/utk/people/JackDongarra/la-sw.html

Hypothraxer
2011-02-20, 19:54:02
Vielen Dank für die Links - da gibt's ja einiges :) Was ich unterdessen noch gefunden habe, sind diese zwei hier:

http://www.ics.forth.gr/~lourakis/sba/

http://www.inf.ethz.ch/personal/chzach/opensource.html (das SSBA).

Es ist im Prinzip genau das, was ich brauche (Bündelausgleichung unter Ausnutzung der dünn-Besetztheit von Matrizen). Der einzige Hacken: Sie setzen projektive Geometrie voraus - und ich arbeite mit perspektivischer Geometrie. Aber das wird sich wohl für die kleine Ausgleichung kurz umbiegen lassen.

Gast
2011-03-01, 14:34:31
Falls es für dich auch interessant wäre, keine fertige Library zu benutzen, sondern dünn besetzte Matrizen selbst zu implementieren, findest du hier Infos dazu:

http://en.wikipedia.org/wiki/Sparse_matrix#Storing_a_sparse_matrix

Hypothraxer
2011-03-06, 19:54:44
Vielen Dank für den Link. Das Prinzip von dünn besetzte Matrizen ist mir wohl bekannt - aber ich bin kein Programmierer :) Ich bin Ingenieur und von da her froh, wenn ich meine lächerlichen Programmierkentnisse zum lösen des eigentlichen Problems nutzen kann und der Rest durch vorgefertigte Libraries abgefertigt wird.