我试图取得内存支持的所有权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)
看起来这不会引起副本,但我并不积极.我也不确定这是否安全.
将内存从内存中剔除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。
代码未测试。