如何为正在增长的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++:特征保守调整大小太贵?提供了另一种有趣的方法,同时提出了关于非连续数据的问题。。。有人对这件事有很好的见解吗?

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

对于您的问题,最简单(可能也是最好)的解决方案是使用块操作来访问最上面的行。

#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 << "nn";
    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) << "nn";
    }
    std::cout << database << "nn";
    return 0;
}

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

最新更新