2017-08-01 83 views
0

我有一个矩阵(x,y,z每列),只想执行二维变换到x和y轴,忽略z。似乎affine2d不能与块相乘,是否有任何其他方式使其工作?如何将affine2d变换应用到3d矩阵块上?

Eigen::matrix<double, 3, 4> x3d; 
x3d << 
    1, 2, 3, 4, 
    2, 3, 4, 5, 
    1, 1, 1, 1; 
auto x2d = x3d.topRows(2); 
Eigen::Affine2d T = Eigen::Translation2d(1, 2) * Eigen::Scaling(1., 2.); 
x2d = T*x2d; 

输出错误:

> /home/lei/Work/SurfTomo/./include/Eigen/src/Geometry/Transform.h:1361:5: 
> error: static_assert failed "YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES" 
>  EIGEN_STATIC_ASSERT(OtherRows==Dim, YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES); 
> ^     ~~~~~~~~~~~~~~ /home/lei/Work/SurfTomo/./include/Eigen/src/Core/util/StaticAssert.h:32:40: 
> note: expanded from macro 'EIGEN_STATIC_ASSERT' 
>  #define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG); 
>          ^   ~ /home/lei/Work/SurfTomo/./include/Eigen/src/Geometry/Transform.h:442:77: 
> note: in instantiation of member function 
>  'Eigen::internal::transform_right_product_impl<Eigen::Transform<double, 
> 2, 2, 0>, Eigen::Block<Eigen::Matrix<double, 3, 4, 0, 3, 4>, -1, 4, 
>  false>, 2, 4>::run' requested here { return internal::transform_right_product_impl<Transform, 
> OtherDerived>::run(*this,other.derived()); } 
>                   ^/home/lei/Work/SurfTomo/test/test_3dto2d.cc:27:10: note: in 
> instantiation of function template specialization 
> 'Eigen::Transform<double, 2, 2, 
>  0>::operator*<Eigen::Block<Eigen::Matrix<double, 3, 4, 0, 3, 4>, -1, 4, false> >' requested here x2d = T*x2d; 
>  ^1 error generated. 

我发现下面的代码就可以解决这个问题,但我不明白为什么它的工作原理。

x2d = T * x2d.colwise().homogeneous(); 

回答

0

Eigen::Affine2d乘以征想知道,在编译时其他矩阵的行(因为取决于不同的代码路径采取的数量和运行时检查可以使显著的开销在这里)。

只需创建使用

auto x2d = x3d.topRows<2>(); 
+0

谢谢您x2d矩阵。优秀的解释。 – Aristotle0