如何为不断增长的 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::vector
的 capacity
与 Eigen 的等价物。
注意:我可能需要在矩阵实际满之前随时使用它。所以我确实需要区分它的 size
和它的 capacity
.
我该怎么做?
编辑 1:我看到有一个 MaxSizeAtCompileTime
但我发现文档相当不清楚,没有示例。任何人都知道这是否是要走的路,如何使用此参数以及它如何与 resize
和 conservativeResize
交互?
编辑 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;
}
您不仅可以打印矩阵,还可以执行任何需要的操作。
我有一个 Eigen::MatrixXd
形式的不断增长的数据库。我的矩阵开始为空,然后逐行添加行,直到达到最大预定义(编译时已知)行数。
目前我是这样成长的(来自 Eigen 文档以及此处和其他地方的许多帖子):
MatrixXd new_database(database.rows()+1, database.cols());
new_database << database, new_row;
database = new_database;
但这似乎比实际需要的效率低得多,因为每次添加新行时都会进行大量无用的内存重新分配和数据复制...看来我应该能够预先分配一个一堆大小为 MAX_ROWS*N_COLS
的内存并让矩阵在其中增长,但是我找不到 std::vector
的 capacity
与 Eigen 的等价物。
注意:我可能需要在矩阵实际满之前随时使用它。所以我确实需要区分它的 size
和它的 capacity
.
我该怎么做?
编辑 1:我看到有一个 MaxSizeAtCompileTime
但我发现文档相当不清楚,没有示例。任何人都知道这是否是要走的路,如何使用此参数以及它如何与 resize
和 conservativeResize
交互?
编辑 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;
}
您不仅可以打印矩阵,还可以执行任何需要的操作。