2013-06-28 8 views
6

Ich habe einen Vektor von ganzen Zahlen und ich möchte eine diagonale Matrix mit Vectos-Element als diagonale Einträge der Matrix erstellen. Zum Beispiel: Wenn Vektor 1 2 3 die Diagonalmatrix ist, wäre:Konstruieren einer Diagonalmatrix aus dem Vektor der ganzen Zahlen: Funktion Eigen

1 0 0 
0 2 0 
0 0 3 

Die naive Weise, es zu tun, etwas mehr als es wäre iterieren und einen Satz Elemente um eins. Gibt es keinen anderen direkten Weg, dies in eigen zu tun. Auch nach dem Konstruieren der Diagonale möchte ich die Inverse berechnen (die gerade die diagonalen Einträge umkehrt), aber es scheint auch keine Möglichkeit zu geben, dies zu tun (direkt, was ebenfalls optimiert wäre) in der Bibliothek selbst.

Ich habe die Dokumentation von diagonal matrices in eigen Bibliothek nachgeschlagen, aber es scheint so als gäbe es keine Möglichkeit. Wenn ich etwas offensichtliches beim Lesen der Dokumentation verpasst habe, weisen Sie bitte darauf hin.

Jede Hilfe wird geschätzt.

+0

Wenn Sie eine Möglichkeit finden, die Matrix schnell aus dem Vektor zu generieren, ist das Invertieren recht einfach: Invertieren Sie die Vektorelemente und erstellen Sie die Matrix von Grund auf neu. – arne

+0

@arne Ich wollte nicht auf Fließkommafehler eingehen, wenn sie auftreten könnten (ich bin mir nicht sicher). Also will Eigen alles handhaben. Ich denke, das wäre einfach. –

+0

Die Seite, die Sie verlinkt haben, gibt einen 3D 'DiagonaMatrix' Konstruktor, der die 3 relevanten Koeffizienten als Argumente verwendet. Es gibt auch eine Methode, um den Diagonalvektor aus einer solchen Matrix zu extrahieren, mit der Sie den invertierten Vektor "von Hand" berechnen und eine neue Matrix mit erstellen können. – didierc

Antwort

10

Nach this part of the documentation Sie haben schon einige Optionen, die einfachste zu sein

auto mat = vec.asDiagonal(); 
+0

Korrekte Dokumentation kann manchmal schwierig zu finden sein. Ich habe Google-Suche gemacht, aber das ist nicht aufgetaucht. Es mag seltsam klingen, aber irgendwelche Tricks/Tipps? –

+0

Ich habe die Abfrage 'diagonal matrix from vector eigen' verwendet, also keine echten Tricks hier :) – filmor

+0

Dokumentation link is dead. – Cecilia

1

Sie geeignete Typen mit Eigen verwenden sollten, wenn Sie wirklich wissen, was Sie

//Create a 4x4 diagonal matrix from the vector [ 5 6 7 8 ] 
Eigen::Vector4d vec; 
vec << 5, 6, 7, 8; 
Eigen::DiagonalMatrix<double, 4> mat = vec.asDiagonal(); 

tun verwenden Auto ist ein wirklich rutschiger Hang, wo Sie in der Regel keine Ahnung haben, was der Compiler als Typ verwendet, und gekoppelt mit Eigen ist dies eine der häufigsten Quellen für trickreiche Fehler (siehe https://eigen.tuxfamily.org/dox/TopicPitfalls.html)

Verwandte Themen