我试图将矩阵块作为函数的左值返回。假设我的函数看起来像这样:
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);
谢谢!
答案 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会在转换之前复制数据。