2012-04-13 5 views
4

Ich kann nicht für das Leben von mir herausfinden, warum das nicht richtig funktioniert. Es scheint das k-te Element nicht zurückzugeben.C++: Eigene Bibliothek Neuling Sort

typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic> matrix; 

double test(matrix& D, int k) 
{ 
    auto d = D.row(1); 
    std::nth_element(d.data(),d.data()+k, d.data()+d.size()); 
    return d(k) ; 
} 

Ich habe auch versucht

template <typename ScalarType, typename Derived> 
void Sort(Eigen::MatrixBase<Derived> &xValues) 
{ 
std::sort(xValues.derived().data(), xValues.derived().data()+xValues.derived().size()); 
} 


double test(matrix& D, int k) 
{ 
    auto d = D.row(1); 
    Sort<double>(d); 
    return d(k) ; 
} 

Jede Hilfe sehr geschätzt.

Edit: -

Ich habe gerade versucht,

auto d = D.row(1); 

zu

Eigen::VectorXd rowD = D.row(1); 
.... 

ändern und es scheint gut zu funktionieren.

Leicht durcheinander verwirrt.

Antwort

6

Eigene Matrizen sind standardmäßig column-major. Das bedeutet, dass eine Zeile einer Matrix kein zusammenhängendes C-Array ist und Sie den Datenzeiger nicht als Iterator verwenden können.

Zum Beispiel würde eine 3x4-Matrix als gespeichert:

 
0 3 6 9 
1 4 7 10 
2 5 8 11 

Jetzt row(1)

 
1 4 7 10 

sein würde, aber der Zeiger Iterator Sie nth_element() wird Zugriff vorbei sind

 
1 2 3 4 

Ihr Code funktioniert, wenn Sie Ihreänderntypedef Zeilen-Haupt:

typedef Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor> matrix; 

Update: Ihre editierten Beispiel funktioniert, da Sie die Zeile auf einen Vektor kopieren. Für Vektoren (eindimensionale Matrizen) spielt es keine Rolle, ob die Daten in Zeilenhauptreihe oder Spaltenhauptreihe gespeichert sind.