Eigen3: извлечь подматрицу с непостоянным числом столбцов

Я написал следующую функцию в C ++, используя Eigen3:

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

Решение

Посмотрите документацию по использованию блочных операций.

Есть две версии, синтаксис которых следующий:

Блок операции с
блок размера (p,q), начинается с (i,j)

Версия, создающая выражение блока динамического размера

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

Версия построения
блочное выражение фиксированного размера

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

Для вашего случая используйте:

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

Другие решения


По вопросам рекламы [email protected]