2016-07-28 53 views
1

Ich habe ein Eigen MatrixXd-Objekt namens v, und ich habe einige Probleme beim Zugriff auf diese Matrix Inhalt. Wenn ich den Inhalt nur an der Konsole (wie im Code) drucke, funktioniert das genauso gut. Wenn ich versuche, den Inhalt zu verwenden, zeigt der Fehler auf:Eigen C++ Assertion fehlgeschlagen

Assertion fehlgeschlagen: (row> = 0 & & Reihe < Reihen() & & col> = 0 & & col < cols()), Funktion operator(), Datei /usr/local/Cellar/eigen/3.2.4/include/eigen3/Eigen/src/Core/DenseCoeffsBase.h, Linie 337.

ChosenPoint ** points = new ChosenPoint*[width]; 
    for (int i = 0; i < width; i++) 
    { 
     points[i] = new ChosenPoint[height]; 
     for (int j = 0; j < height; j++) 
     { 
      points[i][j].setPoint(i, j, false); 
      points[i][j].setNumberOfFrames(numberOfFrames); 
     } 
    } 

Matrix<double, 2, 1> v = (aT * a).inverse() * aT * b; 
if (v.rows() == 2 && v.cols() == 1) 
{ 
    points[x][y].setFlow(v(0,0), v(1,0), frame); 
} 

Und meine ChosenPoint Klasse:

typedef struct point 
{ 
    double x; 
    double y; 
    bool isValid; 
} point; 

class ChosenPoint 
{ 
public: 
ChosenPoint() 
{ 

} 

~ChosenPoint() 
{ 
} 

void setNumberOfFrames(int numberOfFrames) 
{ 
    this->flow = new point[numberOfFrames]; 

    for (int i = 0; i < numberOfFrames; i++) 
    { 
     point f; 
     f.x = 0.0; 
     f.y = 0.0; 
     this->flow[i] = f; 
    } 
} 

void setPoint(int x, int y, bool isValid) 
{ 
    this->pt.x = (double) x; 
    this->pt.y = (double) y; 
    this->pt.isValid = isValid; 
} 

point getPoint() 
{ 
    return this->pt; 
} 

point* getFlow() 
{ 
    return this->flow; 
} 

void setFlow(double &xFlow, double &yFlow, int &position) 
{ 
    this->flow[position].x = xFlow; 
    this->flow[position].y = yFlow; 
} 

void updateFlow(int position) 
{ 
    this->flow[position].x = 2*this->flow[position].x; 
    this->flow[position].y = 2*this->flow[position].y; 
} 

void updateFlow(double xFlow, double yFlow, int position) 
{ 
    this->flow[position].x = xFlow; 
    this->flow[position].y = yFlow; 
} 

point pt; 
point *flow; 

};

+0

Ihr Problem hängt wahrscheinlich mit 'Punkten' zusammen. – user4759923

+0

Wenn ich Punkte [p] .setArray (0.0.0.0) oder irgendein anderes Doppel mache, funktioniert das genauso gut. Und der Fehler deutet auf etwas bei Eigen, nicht wahr? – PamelaTabak

+1

Können Sie ein [MCVE] bereitstellen? –

Antwort

0

Meine Schuld. Das Problem lag bei einer der anderen Matrizen, die ich im Projekt verwendete, und ich brauchte eine Weile, um es herauszufinden. Leider scheint Eigen nicht wirklich hilfreich zu sein, wenn das passiert:

Ich hatte 2 Matrizen (A und B). Die Matrix mit dem Problem war A (irgendwie wurden einige Daten nicht in die Matrix geladen). Aber wenn ich A und B multiplizierte, erzeugte es eine neue Matrix C mit einigen gültigen Ergebnissen (alle meine Plausibilitätsprüfungen waren unbrauchbar). Ich gebe zu, ich kenne nicht viel Eigen.

Wie auch immer, ich hoffe, dies ist hilfreich für mehr Leute wie mich.