我一直试图通过函数在运行时给出矩阵大小,例如
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);
有什么想法吗?
答案 0 :(得分: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);
答案 1 :(得分:0)
阅读Matrix size allocation上的文档也有帮助,该文档指出:
固定尺寸与动态尺寸:
固定大小表示已知行数和列数 编译时。在这种情况下,本征分配系数数组 作为固定大小的数组,作为类成员。这非常有意义 小矩阵,通常高达4x4,有时高达16x16。较大的 即使发生以下情况,也应将矩阵声明为动态大小 在编译时知道它们的大小。动态尺寸表示数字 行或列的数量在编译时不一定是已知的。在这 如果它们是运行时变量,并且系数数组是 在堆上动态分配。请注意,稠密矩阵 固定尺寸或动态尺寸,请勿动态扩展 一个std :: map。如果您想要这种行为,请参见稀疏模块。