Eigen3:提取具有非常数列的子矩阵

时间:2015-08-05 15:48:40

标签: c++ eigen3 submatrix

我使用Eigen3:

在C ++中编写了以下函数
MatrixXf transformPoints(MatrixXf X, MatrixXf P)
{
    // create a new matrix to host points
    MatrixXf tempMatrix = MatrixXf::Zero(4, P.cols());

    // extract rotational and traslational parts from X
    MatrixXf rotmat = tempMatrix.block<2,2>(0,0);
    Vector2f traMat = tempMatrix.block<2,1>(0,2);

    // separate points from normals
    // int cols_of_P = P.cols();
    MatrixXf points = tempMatrix.block<2,P.cols()>(0,0);
    MatrixXf normals = tempMatrix.block<2,P.cols()>(2,0);
}

在我的想法中,在最后两行中,我应该能够从p中提取子矩阵,其列数不是先验的,但它取决于P的大小。 我收到以下错误:

home/ubisum/fuerte_workspace/thesis_pack/src/least_squares_utilities.h: In function ‘Eigen::MatrixXf least_squares::transformPoints(Eigen::MatrixXf, Eigen::MatrixXf)’:
/home/ubisum/fuerte_workspace/thesis_pack/src/least_squares_utilities.h:18:47: error: ‘P’ cannot appear in a constant-expression
/home/ubisum/fuerte_workspace/thesis_pack/src/least_squares_utilities.h:18:49: error: ‘.’ cannot appear in a constant-expression
/home/ubisum/fuerte_workspace/thesis_pack/src/least_squares_utilities.h:18:54: error: a function call cannot appear in a constant-expression
/home/ubisum/fuerte_workspace/thesis_pack/src/least_squares_utilities.h:18:60: error: no matching function for call to ‘Eigen::Matrix<float, -0x00000000000000001, -0x00000000000000001>::block(int, int)’

我甚至尝试了以下修改:

int cols_of_P = P.cols();
MatrixXf points = tempMatrix.block<2,cols_of_P>(0,0);
MatrixXf normals = tempMatrix.block<2,cols_of_P>(2,0);

但没有改变。 你能救我吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

查看使用块操作的文档。

有两个版本,其语法如下:

阻止操作 大小为(p,q)的块,从(i,j)

开始

构建动态大小块表达式的版本

matrix.block(i,j,p,q);

版本构建  固定大小的块表达式

matrix.block<p,q>(i,j);

对于您的案例使用:

tempMatrix.block(0, 0, 2, 2)