簡體   English   中英

表達式必須具有常數值本征矩陣

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM