从特征矩阵外化数据

时间:2017-02-21 21:20:21

标签: c++ eigen

我试图获取支持Eigen::Matrix的内存的所有权而不复制内存。 data()方法保留所有权。我弄清楚如何做到这一点的唯一方法是交换映射的数组:

Matrix<float, Dynamic, Dynamic, RowMajor> mat = m1 * m2;
// want ownership of mat's float*

float* data = mat.data(); // get the pointer
new (&mat) Eigen::Map<Matrix3f>(NULL); // swap the mapped array with anything else
// do something with data

看起来这不会引起副本,但我并不积极。我也不确定这是否安全。

1 个答案:

答案 0 :(得分:3)

Eigen的胆量中撕掉记忆是不礼貌的,其中最重要的是因为你不知道它是如何分配的,或者是Matrix拥有的其他内容。

然而,有Map template,它允许您将无主缓冲区包装成类似特征矩阵的类型。

此类型不是实际的特征矩阵,因此您自己的自定义函数可能无法使用它,但它应该与特征函数一起使用。

在这种情况下,您已拥有数据。

using matrix_type = Matrix<float, Dynamic, Dynamic, RowMajor>;
using mapped_matrix_type = Map<matrix_type>;

现在我们创建一个缓冲区,将其包装在mapped_matrix_type中,然后分配:

auto raw = std::make_unique<float[]>(m1.rows()*m2.cols()); // maybe backwards
mapped_matrix_type bob(raw.get(), m1.rows(), m2.cols());
bob = m1*m2;

bob的原始数据位于rawunique_ptr拥有的缓冲区(如果您需要使其完全无主,则可以release()。)

任何原始存储机制(vector,原始new或其他任何内容)都可以取代raw

代码未经测试。