2016-10-18 66 views
0

我一直在试图给矩阵大小,同时通过功能运行时,例如表达必须具有恒定的值特征矩阵

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); 
} 

(上面的代码是从https://stackoverflow.com/a/39146048/3782963),我不能够发送一个常数矩阵大小的值函数,我得到Expression must have constant value错误。有没有什么办法可以做到这样的事情:

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

有什么想法吗?

回答

2

这条线是你的问题:

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

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

告诉用户它应该期待一个常量大小的矩阵Map

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

是动态大小的矩阵。如果由于某种原因,你要忽略文件中的基体的形状和你的程序定义它,尝试:

Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>> 
               (values.data(), rows_csv, columns_csv); 
+0

您应该使用',而不是'-1'征:: Dynamic',但是(尽管价值是不会再有变化的)。而对于防御性编程来说,检查每一行是否有相同数量的条目是有意义的。 – chtz

+0

@chtz更改为“Eigen :: Dynamic”。至于防御性编程,在OP链接的问题中,这将是相关的(我如何将csv文件读入特征矩阵?)。在这种情况下(正如我所理解的那样),他/她想要覆盖文件中矩阵的形状,而不管它是否是矩形。 –

+0

但是不是那么慢?如果我使用Eigen :: Dynamic,它似乎占用了相当多的内存。 – Akshay