有没有一种有效的方法可以在不重新分配的情况下删除已经分配但空的本征行?

Is there an efficient way of deleting already allocated but empty Eigen rows without reallocation?

我正在尝试使用 Eigen::Matrix class 编写运行时高效的代码。为了改进运行时间,我知道建议调整 Eigen::Matrix 的大小,以便分配足够的内存,从而避免重新分配。但是,我不知道编译时或矩阵初始化时的行数。我想做的是使用动态大小的矩阵,分配已知上限的内存,然后将一些数据填充到矩阵中,最后 "cutoff/reshape" 我不需要的低端行。

所以我的问题看起来是这样的,除了我分配的内存比 (5,3) 大得多

    Eigen::MatrixXi M;
    M.resize(5,3);
    std::cout << "M size: (" << M.rows() << "x" << M.cols()<< " ) with Entries:\n"<< M << std::endl;
    M.row(0) = Eigen::RowVector3i(1, 1, 1);
    M.row(1) = Eigen::RowVector3i(2, 2, 2);
    M.row(2) = Eigen::RowVector3i(3, 3, 3);
    //M.reshape(3, 3); ??
    std::cout << "M size: (" << M.rows() << "x" << M.cols() << " ) with Entries:\n" << M << std::endl;

我知道以下代码可以工作,但此代码段包括重新分配新内存,而不仅仅是 "freeing" M 的较低行或重新映射 M 的内存;

    // works but inefficient
    Eigen::MatrixXi M2;
    M2.resize(3, 3);
    M2 = M.topRows(3);

你对我如何更有效地实施这个想法有什么想法吗?

首先,如果您要添加条目 row-by-row,使用 row-major 矩阵可能更有效。此外,如果已知 compile-time 处的列数为 3,则可以用以下类型表示:

typedef Eigen::Matrix<int, Eigen::Dynamic, 3, Eigen::RowMajor> MatrixRX3i;
MatrixRX3i M;
M.resize(5,3);

如果不介意一直保留M的整个内存,可以将M2定义为一个Eigen::Ref对象:

Eigen::Ref<MatrixRX3i> M2(M.topRows(3));

如果你想释放不必要的内存,你应该使用conservativeResize():

M.conservativeResize(3,3);

理想情况下,这应该只调用 std::realloc(以防内部维度不改变),尽管可能有一些与对齐相关的 corner-cases.