2012-11-25 17 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