特征库:在函数中返回矩阵块作为左值

时间:2012-11-25 04:23:08

标签: function reference block eigen lvalue

我试图将矩阵块作为函数的左值返回。假设我的函数看起来像这样:

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

事实证明,似乎C ++编译器理解block()运算符只提供临时值,因此编译器禁止将其作为左值返回。然而,在Eigen文档中有一些例子我们可以使用Eigen作为左值(http://eigen.tuxfamily.org/dox/TutorialBlockOperations.html#TutorialBlockOperationsUsing),所以我想知道我们怎么不能用函数做同样的事情返回。

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

谢谢!

1 个答案:

答案 0 :(得分:7)

我想把自己发现的东西放在其他人身上:

我的基本解决方案是知道你想要块的派生类型。在这种情况下:

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会在转换之前复制数据。