我试图获取支持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
看起来这不会引起副本,但我并不积极。我也不确定这是否安全。
答案 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
的原始数据位于raw
,unique_ptr
拥有的缓冲区(如果您需要使其完全无主,则可以release()
。)
任何原始存储机制(vector
,原始new
或其他任何内容)都可以取代raw
。
代码未经测试。