2015-08-05 2 views
1

я написал следующую функцию в C++, используя Eigen3: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); 

, но ничего не изменилось. Вы можете мне помочь?

спасибо.

+0

аргументов шаблона должны быть компиляции постоянная времени - неизменно. Ни 'P', ни' cols_of_P' не является выражением coinstant времени компиляции. – Pixelchemist

ответ

1

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

Существуют две версии, синтаксис которого выглядит следующим образом:

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

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

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

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

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

Для вашего использования:

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

Это сработало. Благодарю. – ubisum