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

Hua*_*ham 6 reference function block lvalue eigen

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

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

事实证明,似乎C++编译器的理解是块()算子仅给出临时值等返回它作为一个左值是由编译器禁止.然而,本征文档中有一些例子,我们可以使用本征作为左值(http://eigen.tuxfamily.org/dox/TutorialBlockOperations.html#TutorialBlockOperationsUsing),所以我想知道我们怎么也做相同的功能返回.

a.block(0,0,2,3) = a.block(2,1,2,3);
Run Code Online (Sandbox Code Playgroud)

谢谢!

Hua*_*ham 7

我想把我发现自己的东西放在一起,这样对其他人可能会有所帮助:

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

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

有趣的是我注意到这个方法默认会返回对矩阵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;
Run Code Online (Sandbox Code Playgroud)

矩阵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;
Run Code Online (Sandbox Code Playgroud)

不管用.我的理解是,一旦我们将块转换为另一种类型,Eigen会在转换之前复制数据.