[英]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);
閱讀有關矩陣大小分配的文檔也有幫助,該文檔指出:
固定尺寸與動態尺寸:
固定大小意味着已知的行數和列數是編譯時的。 在這種情況下,Eigen將系數數組分配為固定大小的數組,作為類成員。 對於非常小的矩陣(通常最大為4x4,有時最大為16x16),這是有意義的。 即使較大的矩陣在編譯時就知道其大小,也應將其聲明為動態大小。 動態大小意味着在編譯時不一定知道行數或列數。 在這種情況下,它們是運行時變量,並且系數數組在堆上動態分配。 請注意,稠密矩陣(無論是固定大小還是動態大小)在std :: map的意義上不會動態擴展。 如果您想要這種行為,請參閱稀疏模塊。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.