2017-08-10 7 views
1

Ich verwende Eigen Solver. Ich habe Probleme beim Abrufen der Werte aus Vektoren/Matrix, die ich erstelle. Im folgenden Code habe ich zum Beispiel keinen Fehler, bekomme aber einen Laufzeitfehler.Abrufen von Werten aus Vektor in Eigen Solver

#include <iostream> 
#include <math.h> 
#include <vector> 
#include <Eigen\Dense> 
using namespace std; 
using namespace Eigen; 

int main() 
{ 
    Matrix3f A; 
    Vector3f b; 
    vector<float> c; 
    A << 1, 2, 3, 4, 5, 6, 7, 8, 10; 
    b << 3, 3, 4; 
    cout << "Here is the matrix A:\n" << A << endl; 
    cout << "Here is the vector b:\n" << b << endl; 
    Vector3f x = A.colPivHouseholderQr().solve(b); 
    for (int i = 0; i < 3; i++) 
    { 
     c[i] = x[i]; 
     cout << c[i] << " "; 
    } 

    //cout << "The solution is:\n" << x << endl; 
    return 0; 
} 

Wie kann ich den Wert in x auf eine Variable meiner Wahl abrufen (Ich brauche dies, da dies ein Parameter in einer anderen Funktion sein, die ich schrieb).

+2

'aber eine Laufzeit error' erhalten Ist es ein etwas geheimes? Kannst du es teilen? – Gluttton

+1

Das Problem ist, dass Ihr 'std :: vector c 'nie Größe 3 geändert wurde (kein Problem mit Eigen, und man sollte das von der Quelle des Laufzeitfehlers sehen) – chtz

+0

Verwenden Sie' c.resize (b. Größe()); ' – RHertel

Antwort

2

Verwenden

vector<float> c(3); 

Oder

for (int i = 0; i < 3; i++) 
{ 
    c.push_back(x[i]); 
    cout << c[i] << " "; 
} 
3

Wie im Kommentar erwähnt, war das Problem, dass c nicht bevor Werte zuweisen, um es der Größe verändert wurde. Darüber hinaus brauchen Sie eigentlich nicht die Eigen::Vector3f x, aber Sie können das Ergebnis der .solve() Betrieb direkt an einen Map, die zu den Daten des vector Punkte vergeben:

#include <iostream> 
#include <vector> 
#include <Eigen/QR> 
using namespace Eigen; 
using namespace std; 

int main() 
{ 
    Matrix3f A; 
    Vector3f b; 
    vector<float> c(A.cols()); 
    A << 1, 2, 3, 4, 5, 6, 7, 8, 10; 
    b << 3, 3, 4; 
    cout << "Here is the matrix A:\n" << A << endl; 
    cout << "Here is the vector b:\n" << b << endl; 
    Vector3f::Map(c.data()) = A.colPivHouseholderQr().solve(b); 

    for(int i=0; i<3; ++i) std::cout << "c[" << i << "]=" << c[i] << '\n'; 
} 
Verwandte Themen