Eigen ist eine bekannte Matrix-Bibliothek in C++. Ich habe Probleme, eine eingebaute Funktion zu finden, um ein Element einfach an das Ende einer Matrix zu schieben. Zur Zeit weiß ich, dass es, wie dies getan werden kann:Eigen MatrixXd Push zurück in C++
Eigen::MatrixXd matrix(10, 3);
long int count = 0;
long int topCount = 10;
for (int i = 0; i < listLength; ++i) {
matrix(count, 0) = list.x;
matrix(count, 1) = list.y;
matrix(count, 2) = list.z;
count++;
if (count == topCount) {
topCount *= 2;
matrix.conservativeResize(topCount, 3);
}
}
matrix.conservativeResize(count, 3);
Und dies funktionieren wird (einige der Syntax sein kann aus). Aber es ist ziemlich kompliziert für eine einfache Sache zu tun. Gibt es bereits eine integrierte Funktion?
Mit "Wohlen Eigen" können Sie MaxRows MaxCols zur Kompilierzeit definieren. Selbst wenn Sie die genaue Größe bis zur Laufzeit nicht kennen, bleiben die Speicheranforderungen beschränkt (für die resize/push_back-Operationen sind keine Speicherzuweisungen erforderlich). Es wäre nett, wenn Sie push_back Elemente, Zeilen und Spalten so lange wie Größe
gnzlbg
"Außerdem sind in der linearen Algebra Matrix und Vektorgrößen fast immer konstant und vorher bekannt." In den meisten iterativen Algorithmen wissen Sie nicht, wie viele Iterationen erforderlich sind, bis ein Konvergenzkriterium erfüllt ist. – Lindon
Modulo die Vorbehalte oben, wenn ich das wirklich brauchte, würde ich eine größere Matrix zuweisen und dann einen Block, der den verwendeten Teil der Matrix darstellt. Um zu pushen, geben Sie Werte der Speichermatrix ein und erstellen einen neuen erweiterten Block, der den neuen verwendeten Teil abdeckt. Wenn Sie die Größe Ihrer Speichermatrix ausgeschöpft haben, verteilen Sie sie neu, indem Sie jede Dimension verdoppeln. Dies ist eine amortisierte Konstante, genau wie std :: vector. Dies könnte einmal als benutzerdefinierte Klasse umbrochen werden. (Ich kenne die besonderen Einschränkungen von Blöcken im Vergleich zu Matrizen nicht. Ich habe sie nur ein paar Mal benutzt.) – THK