我有一个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++:特征保守调整大小太贵?提供了另一种有趣的方法,同时提出了关于非连续数据的问题。。。有人对这件事有很好的见解吗?
在忘记之前,我想提到的第一件事是,您可能需要考虑使用行主矩阵进行存储。
对于您的问题,最简单(可能也是最好)的解决方案是使用块操作来访问最上面的行。
#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;
}
您可以执行所需的任何操作,而不仅仅是打印矩阵。