如何为不断增长的Eigen :: MatrixXd预分配内存

时间:2015-11-06 02:20:20

标签: c++ memory eigen

我的数据库正在以Eigen::MatrixXd的形式增长。我的矩阵开始为空并逐个添加行,直到达到最大预定义(在编译时已知)行数。

此刻我就像那样成长(来自Eigen docs以及此处和其他地方的许多帖子):

MatrixXd new_database(database.rows()+1, database.cols());
new_database << database, new_row;
database = new_database;

但这似乎比它需要的效率更低,因为每次添加新行时它会进行大量无用的内存重新分配和数据复制......似乎我应该能够预先分配一堆大小为MAX_ROWS*N_COLS的内存并让矩阵在其中生长,但是我无法找到具有Eigen的std::vector capacity的等价物。

注意:我可能需要在实际填满之前随时使用矩阵。所以我确实需要区分它的size和它的capacity

我该怎么做?

编辑1:我看到有一个MaxSizeAtCompileTime,但我觉得这个文档很不清楚,没有例子。任何人都知道这是否可行,如何使用此参数以及它如何与resizeconservativeResize互动?

编辑2:C++: Eigen conservativeResize too expensive?提出另一个有趣的方法,同时提出有关非连续数据的问题......任何人都对此有一些好的见解?

1 个答案:

答案 0 :(得分:2)

在我忘记之前,我想提及的第一件事是你可能想考虑使用行主矩阵进行存储。

您问题的最简单(也可能是最佳)解决方案是使用block operations访问热门行。

#include <Eigen/Core>
#include <iostream>

using namespace Eigen;

int main(void)
{
    const int rows = 5;
    const int cols = 6;

    MatrixXd database(rows, cols);
    database.setConstant(-1.0);

    std::cout << database << "\n\n";

    for (int i = 0; i < rows; i++)
    {
        database.row(i) = VectorXd::Constant(cols, i);

        // Use block operations instead of the full matrix
        std::cout << database.topRows(i+1) << "\n\n";

    }

    std::cout << database << "\n\n";

    return 0;
}

您可以执行所需的任何操作,而不仅仅是打印矩阵。