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

Function 特征库:返回函数中的矩阵块作为左值,function,reference,block,eigen,lvalue,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); } 谢谢大家! 我想把我自己发现的东西放进去,这样可能会对其他人有所帮助: 我的基本解决方案是知道您希望块是什么派生类型。在这种情况下: Block<MatrixXd> getBlock

我试图将矩阵块作为函数的左值返回。假设我的函数如下所示:

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

谢谢大家!

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

我的基本解决方案是知道您希望块是什么派生类型。在这种情况下:

Block<MatrixXd> getBlock(MatrixXd & m, int i, int j, int row, int column)
{
    return m.block(i,j,row,column);
}
Block getBlock(MatrixXd&m、int i、int j、int行、int列)
{
返回m.block(i,j,行,列);
}
我很感兴趣地注意到,默认情况下,该方法将返回对矩阵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;
MatrixXd m=MatrixXd::零(10,10);
块myBlock=getBlock(m,1,1,3,3);

myBlock多亏了表达式模板,block()实际上并不返回块的副本,而是返回一个expression@user3183610那么如何强制块(表达式)求值。我的意思是作为有效的左值。@stanleyerror可以通过调用eval()或将其分配给数组或矩阵类型(读取非表达式的内容)。这就是为什么第二个例子没有改变原始矩阵的原因。块是一个表达式,指向原始矩阵中的元素,但当您将块指定给另一个MatrixXd变量时,将对该表达式求值,并将结果存储在该变量中。该变量现在显然有自己的内存,就像任何
MatrixXd mat=other_mat
赋值一样。
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;
MatrixXd m = MatrixXd::Zero(10,10);
MatrixXd myBlock = getBlock(m, 1, 1, 3, 3);
myBlock << 1, 0, 0, 
           0, 1, 0, 
           0, 0, 1;