2017-01-26 6 views
-1

Ich muss einen Vektor mit Werten innerhalb einer for-Schleife mit EIGEN füllen. Im Versuch, dass so etwas wie ...Füllen dynamischen Vektor mit EIGEN-Bibliothek

#include <iostream> 
#include <Eigen/Dense> 
using namespace std; 
using namespace Eigen; 

int main(){ 
    VectorXd s; 
    for (int i=0,i<10;i++){ 
    s(i) = (double) i; 
    } 
return 0; 
} 

ich es kompilieren kann, aber wenn ich das Programm ausführen bekomme ich diesen Fehler:

dynamic: /usr/include/Eigen/src/Core/DenseCoeffsBase.h:425: Eigen::DenseCoeffsBase::Scalar& Eigen::DenseCoeffsBase::operator()(Eigen::Index) [with Derived = Eigen::Matrix; Eigen::DenseCoeffsBase::Scalar = double; Eigen::Index = int]: Assertion `index >= 0 && index < size()' failed. Abgebrochen

Ich weiß, dass ich einfach, dass mit dem std erreichen kann: : vektorklasse, aber ich möchte es mit eigen machen, weil ich danach viele matrixoperationen machen muss.

Vielen Dank!

EDIT: für meine Anwendung ich kenne nicht die Größe des Vektors zur Kompilierzeit. Ich möchte herausfinden, ob es eine ähnliche Methode wie vector::push_back in Eigen gibt.

+0

* Assertion 'index> = 0 && index LogicStuff

Antwort

0

Als @Maikel mir geraten. Ich könnte mein Problem mit der Größenänderungsfunktion wie folgt lösen;

#include <iostream> 
#include <Eigen/Dense> 
using namespace std; 
using namespace Eigen; 

int main(){ 
    VectorXd s; 
    for (int i=0,i<10;i++){ 
    s.resize(i+1); 
    s(i) = (double) i; 
    } 
return 0; 
} 

@Jonas machte mir klar, dass ich die Größe des Vektors vor der Schleife wissen, so kann ich einmal vor der Schleife ändern.

über die Formatfunktion in der Dokumentation in Eigen gefunden werden kann:

"The resize() method is a no-operation if the actual matrix size doesn't change; otherwise it is destructive: the values of the coefficients may change. If you want a conservative variant of resize() which does not change the coefficients, use conservativeResize() "

daher, wenn es besser sein könnte conservativeResize() zu verwenden, die Werte werden nicht versichern verloren.

+0

Ich bin mir nicht sicher, ob die Funktion 'resize' garantiert, dass die alten Werte beibehalten werden. Können Sie nicht sagen, wie viel Sie in der Laufzeit benötigen? – Maikel

+0

wann hast du die info für die größe des vektors? Müssen Sie die Größe in einer Schleife ändern oder können Sie es vorher tun? Die Größenänderung in einer Schleife ist normalerweise ineffizient. –

+0

Ich kenne die Größe des Vektors vor der Schleife, das ist ein großartiger Punkt. Vielen Dank! –

2

Sie haben vergessen, Platz für den Vektor zu reservieren. Dies wäre für std::vector gleich.

Versuchen Sie, diese

#include <Eigen/Dense> 
#include <iostream> 

int main() 
{ 
    // resize to 10 elements 
    auto vec = Eigen::VectorXd(10); 
    for (int i = 0; i < vec.size(); ++i) { 
    vec[i] = i; 
    } 
    std::cout << vec << '\n'; 
} 
+0

Das ist das Problem, dass ich die Größe des Vektors zur Kompilierzeit nicht kenne. Mit std :: vector kann ich das mit der Methode push_back machen. Gibt es eine Möglichkeit, das gleiche mit Eigen zu erreichen? Vielen Dank! –

+0

Sie könnten die 'resize' Funktion verwenden. Siehe https://eigen.tuxfamily.org/dox/group__TutorialMatrixClass.html – Maikel

+0

es funktioniert mit der Größenänderungsfunktion. Vielen Dank! –

Verwandte Themen