例如,我一直在尝试通过函数在运行时给出矩阵大小
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);
有什么想法吗?
最佳答案
这一行是你的问题:
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);
关于c++ - 表达式必须具有常量值特征矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40098186/