2014-11-18 3 views
11

Ich versuche, eine Matrix zu initialisieren (mit der Eigen-Bibliothek), um einen Wert ungleich Null zu haben, wenn ich es erstelle. Gibt es einen schönen Weg, dies ohne eine For-Schleife zu tun?Wie soll ich den Inhalt einer großen Matrix in Eigen initialisieren?

Zum Beispiel, wenn ich die ganze Matrix bis 1,0, initialisieren wollte ich mag so etwas wie:

Eigen::MatrixXd mat(i,j) = 1.0; 

oder

Eigen::MatrixXd mat(i,j); 
mat += 1.0; 

(Ich bin es gewohnt, diese Art von Etwas in MATLAB, und es würde Eigen noch netter machen, als es bereits ist. Ich vermute, dass es irgendwo eine eingebaute Methode gibt, die das nicht gefunden hat.)

A sub-que lierte auf diese Frage wäre, wie ein Block von Matrixelementen auf einen Sollwert zu setzen, etwas ilke:

mat.block(i,j,k,l) = 1.0; 
+0

Ich fand eine Antwort, aber es wäre immer noch schön, eine Syntax wie ich vorgeschlagen zu haben ... :) – andyras

+1

Nahe an was Sie wollen: Multiplizieren Sie den Skalar mit 'Eigen :: MatrixXd :: Ones (Zeilen, Spalten) ', wie:' Eigen :: MatrixXd mat (3,3) = 1,5 * Eigen :: MatrixXd :: Ones (3,3) 'Es ist nicht ganz wie MATLAB, aber nahe – vsoftco

+1

Die Syntax, die Sie versucht haben, funktioniert mit' Eigen :: Array, aber nicht mit linearen Algebra-Matrizen, weil in diesem Fall ein skalarer Wert eher assimiliert werden sollte, da die Identitätsmatrix diesen skalaren Wert multipliziert. – ggael

Antwort

14

Wie so oft ich die Antwort in der Dokumentation innerhalb von dreißig Sekunden nach der Veröffentlichung der Frage gefunden. Ich war auf der Suche nach dem Constant function:

Eigen::MatrixXd mat = Eigen::MatrixXd::Constant(i, j, 1.0); 

mat.block(i,j,k,l) = Eigen::MatrixXd::Constant(i, j, 1.0); 
+4

Es gibt auch andere "init" Funktionen, wie 'Eigen :: Matrix :: Zero()' oder 'Eigen :: Matrix :: Ones()' http://eigen.tuxfamily.org/dox/group__TutorialAdvancedInitialization.html – vsoftco

+4

Sowie die 'setConstant (val)', 'setOnes()', 'setZero()', 'fill (val)' Varianten, die kompakter sind, um in Ihren Fällen mit weniger Redundanz zu schreiben. – ggael

+2

Seien Sie vorsichtig bei den Parametern für Block und Eigen :: MatrixXd :: Constant. (i, j) ist die Startposition des Blocks und (k, l) ist die Größe des Blocks. Also, ich denke im zweiten Beispiel sollte das (i, j) Paar auf der rechten Seite (k, l) sein. – jmcarter9t

7

Eigen::MatrixXd::Ones(), Eigen::MatrixXd::Zero() und Eigen::MatrixXd::Random() kann alles, was Sie geben, was Sie wollen, die Matrix in einer dynamischen Art und Weise zu schaffen.

Verwandte Themen