2017-02-21 81 views
5

我試圖在不復制內存的情況下獲取支持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

爲什麼在您需要其數據時不要只保留特徵矩陣對象? – rubenvb

+0

@rubenvb我需要把數據交給另一個我沒有那麼多控制的環境。 – ZachB

+0

這是一個非常不明確的說法。我仍然沒有看到讓Eigen對象保持活躍狀態​​的問題,而其他環境則是如此。 – rubenvb

回答

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的地方。

未經測試的代碼。