【发布时间】:2021-12-23 18:54:16
【问题描述】:
我编写了以下模板来检查三角形是否退化:
template<typename Derived>
bool nondegenerate(const Eigen::PlainObjectBase<Derived>& triangle) {
typedef typename Derived::Scalar scalarType;
if (triangle.cols() == 2) {
Eigen::Matrix<scalarType, 1, 2> v1 = triangle.row(1) - triangle.row(0);
Eigen::Matrix<scalarType, 1, 2> v2 = triangle.row(2) - triangle.row(0);
return v1(0)*v2(1) - v1(1)*v2(0);
} else if (triangle.cols() == 3) {
Eigen::Matrix<scalarType, 1, 3> v1 = triangle.row(1) - triangle.row(0);
Eigen::Matrix<scalarType, 1, 3> v2 = triangle.row(2) - triangle.row(0);
return v1.cross(v2).norm();
} else {
std::cerr << "Undefined input." << std::endl;
return false;
}
}
如果我用Eigen::MatrixXi 类型的矩阵调用nondegenerate,上面的代码可以正常工作:
Eigen::MatrixXi triangle;
triangle.resize(3,2);
triangle << 1,2,3,4,5,6;
nondegenerate(triangle);
但是,如果我将上面的动态大小矩阵替换为固定大小的矩阵:
Eigen::Matrix<int, 3, 2> triangle;
triangle << 1,2,3,4,5,6;
nondegenerate(triangle);
它报告编译错误:
/usr/local/include/eigen3/Eigen/src/Core/AssignEvaluator.h:833:3: error: static_assert 由于要求而失败 '(int(Eigen::internal::size_of_xpr_at_compile_time<:matrix> >::ret) == 0 && int(Eigen::internal::size_of_xpr_at_compile_time<:cwisebinaryop int>, const Eigen::Block
, 1, 2, false>, const Eigen::Block , 1, 2, 假> > >::ret) == 0) || ((int(Matrix ::RowsAtCompileTime) == Eigen::Dynamic || int(CwiseBinaryOp<:internal::scalar_difference_op int>, const Eigen::Block , 1, 2, false>, const Eigen::Block , 1, 2, false> >::RowsAtCompileTime) == 特征::动态 || int(Matrix ::RowsAtCompileTime) == int(CwiseBinaryOp<:internal::scalar_difference_op int>, const Eigen::Block , 1, 2, false>, const Eigen::Block , 1, 2, false> >::RowsAtCompileTime)) && (int(Matrix ::ColsAtCompileTime) == Eigen::Dynamic || int(CwiseBinaryOp<:internal::scalar_difference_op int>, const Eigen::Block , 1, 2, false>, const Eigen::Block , 1, 2, false> >::ColsAtCompileTime) == 特征::动态 || int(Matrix ::ColsAtCompileTime) == int(CwiseBinaryOp<:internal::scalar_difference_op int>, const Eigen::Block , 1, 2, false>, const Eigen::Block , 1, 2, false> >::ColsAtCompileTime))) ' “YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES” EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(ActualDstTypeCleaned,Src) ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~ /usr/local/include/eigen3/Eigen/src/Core/util/StaticAssert.h:190:3:注意:从宏扩展 'EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE' EIGEN_STATIC_ASSERT(
^~~~~~~~~~~~~~~~~~~~~~ /usr/local/include/eigen3/Eigen/src/Core/util/StaticAssert.h:33:40:注意:从宏“EIGEN_STATIC_ASSERT”扩展 #define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG); ^ ~ /usr/local/include/eigen3/Eigen/src/Core/PlainObjectBase.h:732:17:注意:在函数模板特化的实例化中 'Eigen::internal::call_assignment_no_alias<:matrix>, Eigen::CwiseBinaryOp<:internal::scalar_difference_op int>, const Eigen::Block, 1, 2, false>, const Eigen::Block , 1, 2, false> >, Eigen::internal::assign_op >' 在这里请求 internal::call_assignment_no_alias(this->derived(), other.derived(), internal::assign_op >::_set_noalias<:cwisebinaryop int>, const Eigen::Block , 1, 2, false>, const Eigen::Block , 1、2、假> > >' 在这里请求 _set_noalias(其他); ^ /usr/local/include/eigen3/Eigen/src/Core/Matrix.h:377:9:注意:在函数模板特化的实例化中 'Eigen::PlainObjectBase<:matrix> >::PlainObjectBase<:cwisebinaryop int>, const Eigen::Block , 1, 2, false>, const Eigen::Block , 1、2、假> > >' 在这里请求 :基础(其他。派生()) ^ testEigenIgl.cpp:1052:42: 注意:在函数模板特化的实例化中'Eigen::Matrix ::Matrix<:cwisebinaryop int>, const Eigen::Block , 1, 2, false>, const Eigen::Block , 1、2、假> > >' 在这里请求 Eigen::Matrix v1 = triangle.row(1) - triangle.row(0); ^ testEigenIgl.cpp:1082:7: 注意:在函数模板特化的实例化中'nondegenerate<:matrix> >' 在这里请求
如何修复模板以同时接受动态和固定大小的矩阵?
谢谢!
【问题讨论】:
-
您应该确定矩阵的大小是否是静态的,并在这种情况下使用
if constexpr。如果您使用C++14或更早的版本,那么您应该使用基于 SFINAE 的技术并针对不同情况重载该方法。
标签: c++ templates matrix eigen