表达式必须具有常值特征矩阵
Expression must have constant value 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);
}
(以上代码来自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);
阅读关于矩阵大小分配的文档也很有帮助,其中规定:
固定大小与动态大小:
Fixed-size表示已知的行数和列数为编译时。在本例中,Eigen分配系数数组作为固定大小的数组,作为类成员。这对非常有意义小矩阵,通常高达4x4,有时高达16x16。更大的应该将矩阵声明为动态大小,即使发生了这种情况在编译时了解它们的大小。动态大小意味着数字在编译时不一定知道行或列的。在这个它们是运行时变量,系数数组是在堆上动态分配。注意密集矩阵固定大小或动态大小,不进行动态扩展std::地图。如果你想要这种行为,请参阅Sparse模块。
相关文章:
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 特征命名访问向量段
- 将特征矩阵的向量设置为0
- 特征:模板函数中矩阵的平面图
- basic_string的前导/尾部不区分空格的特征
- 特征 3 类的模板专用化
- 特征 c++:复矩阵的面积双曲正切(atanh)
- C++ 中的特征向量计算
- 根据C++标准的定义实现"is_similar"类型特征
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- 有没有办法找到特征矩阵系数的中值?
- 如何将高维数据映射到特征类型?
- 将平面阵列重塑为复杂的特征类型
- 特征 LLT 模块给出不正确的结果?
- 特征模板化函数和维度
- 特征稀疏向量:求最大系数
- 特征 3.3.x:如何在所有行中操作 lamba?
- 表达式必须具有常值特征矩阵