c++ - 表达式必须具有常量值特征矩阵

标签 c++ matrix eigen

例如,我一直在尝试通过函数在运行时给出矩阵大小

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/

相关文章:

c++ - Eigen::Cast 稀疏矩阵,特别是行序或列序

c++ - 将 fftw_complex 重新映射到 Eigen 库中的 Matrixcd

c++ - Eigen :1-a.array() 的返回类型

c++ - 控制线程异步执行时间

c++ - 从 const char* 创建一个streambuf?

algorithm - 查找邻接矩阵图的连通分量

python - 将 fortran 翻译为 python : equivalence command used to generate a matrix from text file

c++ - 无法将正确的 lambda 传递给 emscripten_set_main_loop

c++ - 从数据中读取不起作用,但为什么呢?

R:选择矩阵中特定列具有特定值的行