Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/157.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 表达式必须具有常值特征矩阵_C++_Matrix_Eigen - Fatal编程技术网

C++ 表达式必须具有常值特征矩阵

C++ 表达式必须具有常值特征矩阵,c++,matrix,eigen,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; in

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

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);
}

有什么想法吗?

这一行是你的问题:

Eigen::Map<const Eigen::Matrix<double, columns_csv, rows_csv, Eigen::RowMajor>>
                                          (values.data(), rows, values.size() / rows);
是一个动态大小的矩阵。如果出于某种原因,您希望忽略文件中矩阵的形状并在程序中定义它,请尝试:

Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>
                                                 (values.data(), rows_csv, columns_csv);
Eigen::Map
(values.data(),行\u csv,列\u csv);

这一行是您的问题:

Eigen::Map<const Eigen::Matrix<double, columns_csv, rows_csv, Eigen::RowMajor>>
                                          (values.data(), rows, values.size() / rows);
是一个动态大小的矩阵。如果出于某种原因,您希望忽略文件中矩阵的形状并在程序中定义它,请尝试:

Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>
                                                 (values.data(), rows_csv, columns_csv);
Eigen::Map
(values.data(),行\u csv,列\u csv);

阅读以下文件也很有帮助:

固定大小与动态大小:

固定大小意味着行数和列数已知 编译时。在这种情况下,Eigen分配系数数组 作为固定大小的数组,作为类成员。这对很多人来说都是有意义的 小矩阵,通常高达4x4,有时高达16x16。更大的 矩阵应该被声明为动态大小,即使有 在编译时知道它们的大小。动态大小意味着数字 行或列的数量在编译时不一定已知。在这个 如果它们是运行时变量,则系数数组为 在堆上动态分配。注意稠密矩阵,无论它们是 固定大小或动态大小,不要在 地图。如果需要此行为,请参阅稀疏模块


阅读以下文件也很有帮助:

固定大小与动态大小:

固定大小意味着行数和列数已知 编译时。在这种情况下,Eigen分配系数数组 作为固定大小的数组,作为类成员。这对很多人来说都是有意义的 小矩阵,通常高达4x4,有时高达16x16。更大的 矩阵应该被声明为动态大小,即使有 在编译时知道它们的大小。动态大小意味着数字 行或列的数量在编译时不一定已知。在这个 如果它们是运行时变量,则系数数组为 在堆上动态分配。注意稠密矩阵,无论它们是 固定大小或动态大小,不要在 地图。如果需要此行为,请参阅稀疏模块


但是,您应该使用
Eigen::Dynamic
而不是
-1
(尽管该值不会再次更改)。对于防御性编程来说,检查每一行是否有相同数量的条目是有意义的。@chtz改为
Eigen::Dynamic
。至于防御性编程,在OP链接的问题中,这将是相关的(如何将csv文件读入特征矩阵?)。在这种情况下(我理解为OP),他/她希望覆盖文件中矩阵的形状,不管它是否为矩形。但这不是很慢吗?如果我使用
Eigen::Dynamic
它似乎占用了相当多的内存。较慢的速度与此无关。不能将变量用作模板参数,这需要在编译时解析。此外,如果需要内存,动态或静态不会改变内存量,只会改变内存的分配位置(堆与堆栈)。但是,您应该使用
Eigen::dynamic
,而不是
-1
(尽管该值不会再次改变)。对于防御性编程来说,检查每一行是否有相同数量的条目是有意义的。@chtz改为
Eigen::Dynamic
。至于防御性编程,在OP链接的问题中,这将是相关的(如何将csv文件读入特征矩阵?)。在这种情况下(我理解为OP),他/她希望覆盖文件中矩阵的形状,不管它是否为矩形。但这不是很慢吗?如果我使用
Eigen::Dynamic
它似乎占用了相当多的内存。较慢的速度与此无关。不能将变量用作模板参数,这需要在编译时解析。此外,如果需要内存,动态或静态不会改变内存量,只会改变内存的分配位置(堆与堆栈)。
Eigen::Map<Eigen::Matrix<double, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>>
                                                 (values.data(), rows_csv, columns_csv);