有没有办法修改特征切片?

Is there a way to modify eigen slice?

我有一个 Eigen::Matrix<double, M, N> matrix; 并且我有一个函数只需要一个 3x3 切片并修改它

void ModifyBlock(Eigen::Matrix<double, 3, 3> & block){
   // A stupid example
   block += Eigen::Matrix<double, 3, 3>::Identity();
}

无法传递原始矩阵的一部分,因为以下代码无法编译:

int main(int argc, char *argv[]){
    const int M = 10;
    const int N = 20;

    Eigen::Matrix<double, M, N> matrix;
    // Initialize matrix
    ModifyBlock(matrix(vector<int>{1,3,7}, vector<int>{0,2,4});
    return 0;    
}

cannot bind non-const lvalue reference of type ‘Eigen::Matrix<double, 3, 3>&’ to an rvalue of type ‘Eigen::Matrix<double, 3, 3>

不知道有没有办法做到这一点

documentation 中,我找不到提到切片必然是常量引用的内容。

问题不在于切片不可写,而是不能将它们转换为 Eigen::Matrix 的左值引用。使用 C++11,您可以简单地将它们作为右值引用模板传递:

template<class Derived>
void ModifyBlock(Eigen::MatrixBase<Derived> && block){
   // A stupid example
   block += Eigen::Matrix<double, 3, 3>::Identity();
}