2017-11-18 91 views
0

我只是偶然發現了一個動態特徵矩陣的問題。我必須從C數組創建這個數組。 Eigen提供Eigen :: Map與原始緩衝區接口。我想從下面的函數返回一個特徵矩陣:如何返回一個動態特徵矩陣

Eigen::Map<Eigen::Matrix<double, 1, Eigen::Dynamic> returnArray() { 
    double array[4] = {0, 1, 2, 3}; 
    Eigen::Map<Eigen::Matrix<double, 1, Eigen::Dynamic, Eigen::RowMajor> > J_full(array, 1, 4); // the sizes aren't actually known at compile time hence the dynamic array 
    return J_full 
} 

我的問題是,在陣列中的數據不只是抄襲,但指針數組傳遞到地圖構造函數。現在我假設一旦我退出這個函數的範圍,C數組就會被破壞,因此從函數返回的特徵矩陣I中將不會有任何可靠的數據。有沒有什麼辦法可以從數組中創建一個特徵矩陣,以便在返回時保留特徵矩陣的數據?

回答

1

簡單地返回一個Matrix對象:

RowVectorXd returnArray() { 
    double array[4] = {0, 1, 2, 3}; 
    return Eigen::Map<RowVectorXd>(array, 1, 4); 
} 

Map對象引用的數據將被深深複製到返回Matrix對象。

+0

你能解釋爲什麼這個工程?誰決定是否有深度拷貝。在我的例子中,如果我添加行數組[0] = 10;在Map <>構造函數之後,它會更改J_full的內容。 (本徵數組的std :: cout產生10 1 2 3)。在你的例子中,如何執行深度拷貝? –

+1

這很簡單,'Matrix' **總是**擁有它的內存,而'Map'永遠不會。 – ggael