2017-06-06 199 views
4

爲了靈活性,我使用C++庫Eigen將數據加載到動態大小的矩陣(例如Eigen::MatrixXf)中。我寫了一些函數需要混合或固定大小的矩陣作爲參數(例如Eigen::Matrix<float, 3, Eigen::Dynamic>Eigen::Matrix4f)。假設我對行和列的大小做了正確的斷言,我怎樣才能將動態矩陣(在運行時設置的大小)轉換爲固定矩陣(在編譯時設置的大小)?在特徵中將動態矩陣轉換爲固定矩陣

我能想到的唯一的辦法是進行映射,例如:

Eigen::MatrixXf dyn = Eigen::MatrixXf::Random(3, 100); 
Eigen::Matrix<float, 3, Eigen::Dynamic> fixed = 
    Eigen::Map<float, 3, Eigen::Dynamic>(dyn.data(), 3, dyn.cols()); 

但它是我不清楚這是否會工作,要麼是因爲固定大小的地圖構造函數不接受行和列參數在the docs。有更好的解決方案嗎?簡單地將動態分配給固定大小的矩陣不起作用。

+1

使用動態大小的靈活性,然後鑄造到固定大小調用函數聽起來像一個矛盾。你真的需要輸入是動態大小嗎?我的意思是,無論如何,你的功能似乎預計一定的規模...... – user463035818

+0

@ tobi303:原因是我對不同的數據集合使用相同的加載函數。然後,根據我所加載的數據的不同,我調用需要混合或固定大小作爲參數的處理函數(由於typedef)。 – marcman

+0

是的,這應該起作用。不是在最近的版本(至少從3.2.9),你應該能夠不使用'Eigen :: Map'。 – m7913d

回答

5

您可以使用Ref用於這一目的,它是使用你的情況比較簡單,而且它會做的運行時斷言檢查你,例如:

MatrixXf A_dyn(4,4); 
Ref<Matrix4f> A_fixed(A_dyn); 

你甚至可能需要一個固定外,步幅和對齊的內存:

Ref<Matrix4f,Aligned16,OuterStride<4> > A_fixed(A_dyn); 

在這種情況下,A_fixed真的像一個Matrix4f