gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 02:17:39 26 4
gpt4 key购买 nike

我有一个不断增长的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;
}

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

关于c++ - 如何为不断增长的 Eigen::MatrixXd 预分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33558402/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com