如何从Eigen :: Matrix获得内存所有权?

时间:2018-02-05 20:38:13

标签: c++ c++11 memory-management eigen eigen3

动态大小的Eigen::Matrix将其值保存在连续的内存块中。我需要这些值作为我拥有的内存块。我目前使用std::memcpy复制值。

#include <cstdlib>
#include <cstring>
#include <eigen3/Eigen/Core>
using RowMajorMatrixXf = Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor>;
int main()
{
    RowMajorMatrixXf mat(1024, 2048);
    // ...
    const std::size_t num_bytes = mat.rows() * mat.cols() * sizeof(float);
    float* ptr = (float*)std::malloc(num_bytes); // raw ptr for simplicity
    std::memcpy(ptr, mat.data(), num_bytes);
    // ...
    std::free(ptr);
}

然而,复制是不必要的,因为此时不再需要Eigen::Matrix。如何获取Eigen Matrix内存的所有权,从根本上阻止Matrix对象释放其析构函数中的内存?

1 个答案:

答案 0 :(得分:3)

您可以更好地分配自己的缓冲区,并使用Map解释为特征矩阵:

float* ptr = new float[r*c];
Map<RowMajorMatrixXf> mat(ptr,r,c);

然后像RowMajorMatrixXf一样使用mat,除了它的真实类型不是RowMajorMatrixXf,所以你不能通过引用函数来传递它 为RowMajorMatrixXf&Ref<RowMajorMatrixXf>使用Ref<const RowMajorMatrixXf>