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

How to pre-allocate memory for a growing Eigen::MatrixXd

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

目前我是这样成长的(来自 Eigen 文档以及此处和其他地方的许多帖子):

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

但这似乎比实际需要的效率低得多,因为每次添加新行时都会进行大量无用的内存重新分配和数据复制...看来我应该能够预先分配一个一堆大小为 MAX_ROWS*N_COLS 的内存并让矩阵在其中增长,但是我找不到 std::vectorcapacity 与 Eigen 的等价物。

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

我该怎么做?

编辑 1:我看到有一个 MaxSizeAtCompileTime 但我发现文档相当不清楚,没有示例。任何人都知道这是否是要走的路,如何使用此参数以及它如何与 resizeconservativeResize 交互?

编辑 2:C++: Eigen conservativeResize too expensive? 在提出有关非连续数据的问题时提供了另一种有趣的方法......有人对此事有一些很好的见解吗?

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

解决您问题的最简单(也可能是最好)的方法是使用 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;
}

您不仅可以打印矩阵,还可以执行任何需要的操作。