从特征矩阵外化数据

Zac*_*chB 5 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
Run Code Online (Sandbox Code Playgroud)

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

Yak*_*ont 5

将内存从内存中剔除Eigen是不礼貌的,尤其是因为你不知道它是如何分配的或者矩阵还拥有什么。

然而,有一个Maptemplate,它可以让你将一个无主缓冲区包装成一个类似特征矩阵的类型。

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

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

using matrix_type = Matrix<float, Dynamic, Dynamic, RowMajor>;
using mapped_matrix_type = Map<matrix_type>;
Run Code Online (Sandbox Code Playgroud)

现在我们创建一个缓冲区,将其包装在 a 中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;
Run Code Online (Sandbox Code Playgroud)

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

任何原始存储机制(vector、 raw new、其他)都可以代替raw

代码未测试。