2012-11-25 15 views
5

我試圖返回一個矩陣塊作爲函數的左值。比方說我的函數看起來像這樣:本徵庫:返回一個函數中的矩陣塊作爲左值

Block<Derived> getBlock(MatrixXd & m, int i, int j, int row, int column) 
{ 
    return m.block(i,j,row,column); 
} 

事實證明,似乎C++編譯器明白塊()操作符提供了只是暫時的價值,所以返回它作爲一個左值是由編譯器禁止。然而,在Eigen文檔中有一些例子,我們可以使用Eigen作爲左值(http://eigen.tuxfamily.org/dox/TutorialBlockOperations.html#TutorialBlockOperationsUsing),所以我想知道我們怎麼能不能用同樣的功能返回。

a.block(0,0,2,3) = a.block(2,1,2,3); 

謝謝!

回答

6

我想放什麼我發現自己所以它可能會有所幫助別人:

我的基本解決方案是知道派生類型你想要的塊是。在這種情況下:

Block<MatrixXd> getBlock(MatrixXd & m, int i, int j, int row, int column) 
{ 
    return m.block(i,j,row,column); 
} 

有趣的是,我發現,這種方法將參考返回到矩陣m默認的內容。所以如果我們這樣做:

MatrixXd m = MatrixXd::Zero(10,10); 
Block<MatrixXd> myBlock = getBlock(m, 1, 1, 3, 3); 
myBlock << 1, 0, 0, 
      0, 1, 0, 
      0, 0, 1; 

矩陣m中的內容也會被修改。但是,請注意,但是,

MatrixXd m = MatrixXd::Zero(10,10); 
MatrixXd myBlock = getBlock(m, 1, 1, 3, 3); 
myBlock << 1, 0, 0, 
      0, 1, 0, 
      0, 0, 1; 

將不起作用。我的理解是,一旦我們將塊轉換爲另一種類型,Eigen會在轉換之前製作數據的副本。

+0

感謝表達式模板,block()實際上並不返回一個複製塊,而只是返回表達式 –

+0

@ user3183610,所以如何強制一個塊(表達式)進行評估。我的意思是作爲一個有效的左值。 – stanleyerror