2017-07-26 8 views
1

Ich versuche eine lineare Gleichung Ax = b zu lösen, indem ich Eigenes Fähigkeiten für das A als einen quadratischen 2D Vektor benutze. Ich habe den A und b als C++ basierten 2D Vektor und 1D Vektor. Ich konnte jedoch keine Möglichkeit finden, die Werte an die Eigenformatmatrix und -vektoren zu übergeben. Würdest du mir bitte erlauben, die Variable im Eigenformat zu kopieren? Außerdem, was sollte am Anfang die Map-Klasse als mögliches Lösungsmittel verwenden können ?! Hier ist der Code:Werte von Vektoren an Eigenes Bibliotheksformat übergeben

#include <iostream> 
#include <vector> 

#include "Eigen/Dense" 

using namespace std; 
using namespace Eigen; 
int main() 
{ 
    // Let's consider that the A and b are following CPP based vectors: 
    vector<vector<double>> mainA= { { 10.,11.,12. },{ 13.,14.,15. },{ 16.,17.,18. } }; 
    vector<double> mainB = { 2.,5.,8. }; 

    // ??? Here I need to do something to pass the values to the following Eigen 
    //format matrix and vector 

    MatrixXf A; 
    VectorXf b; 

    cout << "Here is the matrix A:\n" << A << endl; 
    cout << "Here is the vector b:\n" << b << endl; 
    Vector3f x = A.colPivHouseholderQr().solve(b); 
    cout << "The solution is:\n" << x << endl; 

} 
+0

Warum verwenden Sie * nur * die Eigenarten? Warum brauchen Sie die C++ Vektoren? –

+0

@Some Programmierer dude Der Grund ist zur Zeit habe ich bestehende Vektoren und ich muss diese Werte für meine Operation verwenden! – ReA

+0

Ich habe hier etwas gefunden: bin mir aber nicht sicher, wie ich es richtig nutzen soll und was ich am Anfang einbinden soll! – ReA

Antwort

0

Wie in den Kommentaren erwähnt, Eigen :: Map <> sollte es tun. Normalerweise werden Sie weg, ohne die Unaligned zu verwenden, aber für die Richtigkeit/Stabilität, ist es am besten, es zu benutzen:

auto A = Eigen::Map<Eigen::MatrixXd, Eigen::Unaligned>(mainA.data(), mainA.size(), mainA[0].size()) 
auto b = Eigen::Map<Eigen::VectorXd, Eigen::Unaligned>(mainB.data(), mainB.size()); 

Vector3d x = A.colPivHouseholderQr().solve(b); 

die Frage unter etwa Robustheit zu beantworten: Diese Hilfsfunktionen durchgeführt werden kann:

template <typename T, int Align> 
Eigen::Map<Eigen::Matrix<T, -1, -1>, Align> CreateMatrix(const std::vector<std::vector<T>>& x) 
{ 
    int R = x.size(); 
    assert(!x.empty()); 
    int C = x[0].size(); 
    #ifndef NDEBUG 
    for(int r=1; r < R; r++) 
     assert(x[r].size() == x[0].size()); 
    #endif 
    return auto A = Eigen::Map<Eigen::Matrix<T,-1,-1>, Align>(x.data(), R, C); 
} 

Obwohl es sehr ausführlich aussieht, führt es eine Vielzahl von Plausibilitätsprüfungen durch, auf die Sie sich dann bei allem Code verlassen können, für den Sie einen Komponententest haben.

+0

Ich frage mich, ob es eine zuverlässigere Möglichkeit gibt, die Matrix oder den Vektor basierend auf dem Eigen-Format zu definieren? Ich frage, weil ich eine Erinnerung (etwas mit malloc relevant) lecke in meinem Code, finden Sie meine Frage [hier] (https://stackoverflow.com/questions/45339532/memory-crash-in-just-2nd- Rund-um-eine-Schleife-inklusive-Eigenfunktionen). Schätze deine Hilfe. – ReA

Verwandte Themen