2016-10-18 8 views
0

Ich habe versucht, die Matrix-Größe, während der Laufzeit über eine Funktion zu geben, zum BeispielExpression muss konstanten Wert hat Eigen Matrix

Eigen::MatrixXd FileReader::load_csv(const std::string & path, const int rows_csv, const int columns_csv) { 
    std::ifstream indata; 
    indata.open(path); 
    std::string line; 
    std::vector<double> values; 
    int rows = 0; 
    while (getline(indata, line)) { 
     std::stringstream lineStream(line); 
     std::string cell; 
     while (std::getline(lineStream, cell, ',')) { 
      values.push_back(std::stod(cell)); 
     } 
     ++rows; 
    } 
    std::cout << "loading"; 
    return Eigen::Map<const Eigen::Matrix<double, columns_csv, rows_csv, Eigen::RowMajor>>(values.data(), rows, values.size()/rows); 
} 

(Above-Code ist aus https://stackoverflow.com/a/39146048/3782963), habe ich nicht in der Lage bin, eine Konstante senden Wert der Matrixgröße für die Funktion, bekomme ich Expression must have constant value Fehler. Gibt es irgendeine Weise, die ich so etwas tun könnte:

Eigen::MatrixXd mat = load_csv("some_path", 20, 30); 

Jede Idee?

Antwort

2

Diese Linie ist Ihr Problem:

Eigen::Map<const Eigen::Matrix<double, columns_csv, rows_csv, Eigen::RowMajor>> 
              (values.data(), rows, values.size()/rows); 

Die

Eigen::Map<const Eigen::Matrix<double, columns_csv, rows_csv, Eigen::RowMajor>> 
              ^^^   ^^^ 

erzählt die Map, dass die, dass es eine konstante Größe Matrix erwarten sollte, und die

(values.data(), rows, values.size()/rows); 
       ^^^    ^^^ 

ist ein dynamisch große Matrix Wenn Sie aus irgendeinem Grund die Form der Matrix in der Datei ignorieren und in Ihrem Programm definieren möchten, versuchen Sie Folgendes:

+0

Sie sollten jedoch 'Eigen :: Dynamisch' anstelle von' -1' verwenden (obwohl der Wert sich im Gegensatz zu immer wieder ändert). Und für die defensive Programmierung kann es sinnvoll sein zu überprüfen, ob jede Zeile tatsächlich die gleiche Anzahl von Einträgen hat. – chtz

+0

@chtz Geändert zu'Eigen :: Dynamisch'. Was die defensive Programmierung betrifft, wäre dies in der Frage OP verknüpft, die relevant wäre (Wie lese ich eine csv-Datei in eine Eigenmatrix?). In diesem Fall (wie ich OP verstehe) möchte er die Form der Matrix in der Datei außer Kraft setzen, unabhängig davon, ob sie tatsächlich rechteckig ist oder nicht. –

+0

Aber ist das nicht langsamer? Wenn ich 'Eigen :: Dynamic' benutze, scheint es ziemlich viel Speicher zu benötigen. – Akshay

Verwandte Themen