Я обертываю два вектора Eigen3 в шаблоном LineSegment<T,dim>
. Вы можете использовать его следующим образом:Как изменить размер вектора в Eigen3
typedef LineSegment<double,2> LineSegment2d;
typedef LineSegment<double,3> LineSegment3d;
typedef LineSegment<int,3> LineSegment3i;
Он содержит шаблонный метод изменения размеров компонентов. Вот уточненное определение:
template<typename T,int dim>
struct LineSegment
{
public:
template<int newDim>
LineSegment<T,newDim> to() const
{
Eigen::Matrix<T,newDim,1> newp1;
Eigen::Matrix<T,newDim,1> newp2;
// TODO initialise newp1 and newp2 from d_p1 and d_p2
return LineSegment<T,newDim>(newp1, newp2);
}
// ... other members ...
protected:
Eigen::Matrix<T,dim,1> d_p1;
Eigen::Matrix<T,dim,1> d_p2;
}
Так что мой вопрос в том, как я могу составить возвращаемое значение, как показано выше? Это должно поддерживать как увеличение, так и уменьшение размера.
Я попытался использовать метод Eigen3 resize(int), но не смог заставить его работать, не видя предупреждений о смешении размеров матрицы.
В конечном счете, это должно работать:
LineSegment2d ls2d;
LineSegment3d ls3d = ls2d.to<3>(); // increase dim
ls2d = ls3d.to<2>(); // decrease dim
Я относительно новым для шаблонов C++, и был бы признателен немного объяснений, если это не просто вопрос API и связана с шаблонами.
Какова желаемая семантика изменения размеров? Проецирование на первые координаты и разложение с нулевыми значениями в новых координатах? – us2012
@ us2012, шаблон должен использоваться скорее как часть робототехнической системы, которая в первую очередь будет преобразовывать между сегментами 2D-линии из изображения камеры в 3D-сегменты линии из карты ее окружения. Это преобразование двунаправлено. Я мог бы использовать подклассы, а не typedefs, и добавлять специальные методы 'to3' и' to2', но задавался вопросом, есть ли способ сделать это. Единственный пример, который я видел для изменения размеров массивов, - это векторы с динамическим размером, такие как 'VectorXd'. –
В Eigen2 я считаю, что вы можете использовать '.start <3>()', но я могу ошибаться. –