我的数据库正在以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
,但我觉得这个文档很不清楚,没有例子。任何人都知道这是否可行,如何使用此参数以及它如何与resize
和conservativeResize
互动?
编辑2:C++: Eigen conservativeResize too expensive?提出另一个有趣的方法,同时提出有关非连续数据的问题......任何人都对此有一些好的见解?
答案 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;
}
您可以执行所需的任何操作,而不仅仅是打印矩阵。