使用Eigen遇到恶心报错
参考博客:https://www.cnblogs.com/wongyi/p/8734346.html
1. 数据类型报错
/home/wy/workdir/slambook/ch3/useEigen/build> make -j2
Scanning dependencies of target eigenMatrix
[ %] Building CXX object CMakeFiles/eigenMatrix.dir/eigenMatrix.cpp.o
In file included from /usr/include/eigen3/Eigen/Core::,
from /home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp::
/usr/include/eigen3/Eigen/src/Core/Product.h: In instantiation of ‘struct Eigen::internal::product_result_scalar<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, Eigen::DenseShape, Eigen::DenseShape>’:
/usr/include/eigen3/Eigen/src/Core/Product.h::: required from ‘struct Eigen::internal::traits<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >’
/usr/include/eigen3/Eigen/src/Core/Product.h::: required from ‘class Eigen::internal::dense_product_base<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , >’
/usr/include/eigen3/Eigen/src/Core/Product.h::: required from ‘class Eigen::ProductImpl<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , Eigen::Dense>’
/usr/include/eigen3/Eigen/src/Core/Product.h::: required from ‘class Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, >’
/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp::: required from here
/usr/include/eigen3/Eigen/src/Core/Product.h::: error: no type named ‘ReturnType’ in ‘struct Eigen::internal::scalar_product_traits<float, double>’
typedef typename scalar_product_traits<typename Lhs::Scalar, typename Rhs::Scalar>::ReturnType Scalar;
^
In file included from /usr/include/eigen3/Eigen/Core::,
from /home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp::
/usr/include/eigen3/Eigen/src/Core/DenseBase.h: In instantiation of ‘class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >’:
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h::: required from ‘class Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >’
/usr/include/eigen3/Eigen/src/Core/Product.h::: required from ‘class Eigen::internal::dense_product_base<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , >’
/usr/include/eigen3/Eigen/src/Core/Product.h::: required from ‘class Eigen::ProductImpl<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , Eigen::Dense>’
/usr/include/eigen3/Eigen/src/Core/Product.h::: required from ‘class Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, >’
/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp::: required from here
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::operator*;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::operator/;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::derived;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::const_cast_derived;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::rows;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::cols;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::size;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::rowIndexByOuterInner;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::colIndexByOuterInner;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::coeff;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::coeffByOuterInner;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::operator();
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::operator[];
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::x;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::y;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::z;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::w;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::stride;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::innerStride;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::outerStride;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::rowStride;
^
/usr/include/eigen3/Eigen/src/Core/DenseBase.h::: error: using-declaration for non-member at class scope
using Base::colStride;
^
In file included from /usr/include/eigen3/Eigen/Core::,
from /home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp::
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h: In instantiation of ‘class Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >’:
/usr/include/eigen3/Eigen/src/Core/Product.h::: required from ‘class Eigen::internal::dense_product_base<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , >’
/usr/include/eigen3/Eigen/src/Core/Product.h::: required from ‘class Eigen::ProductImpl<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , Eigen::Dense>’
/usr/include/eigen3/Eigen/src/Core/Product.h::: required from ‘class Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, >’
/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp::: required from here
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h::: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}::derived’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}’
using Base::derived;
^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h::: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}::const_cast_derived’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}’
using Base::const_cast_derived;
^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h::: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}::rows’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}’
using Base::rows;
^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h::: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}::cols’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}’
using Base::cols;
^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h::: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}::size’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}’
using Base::size;
^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h::: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}::coeff’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}’
using Base::coeff;
^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h::: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}::coeffRef’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}’
using Base::coeffRef;
^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h::: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}::eval’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}’
using Base::eval;
^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h::: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}::operator*=’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}’
using Base::operator*=;
^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h::: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}::operator/=’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}’
using Base::operator/=;
^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h::: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}::operator*’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}’
using Base::operator*;
^
/usr/include/eigen3/Eigen/src/Core/MatrixBase.h::: error: no members matching ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}::operator/’ in ‘Eigen::MatrixBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >::Base {aka class Eigen::DenseBase<Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, > >}’
using Base::operator/;
^
In file included from /usr/include/eigen3/Eigen/Core::,
from /home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp::
/usr/include/eigen3/Eigen/src/Core/Product.h: In instantiation of ‘class Eigen::ProductImpl<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , Eigen::Dense>’:
/usr/include/eigen3/Eigen/src/Core/Product.h::: required from ‘class Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, >’
/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp::: required from here
/usr/include/eigen3/Eigen/src/Core/util/Macros.h::: error: no members matching ‘Eigen::ProductImpl<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , Eigen::Dense>::Base {aka Eigen::internal::dense_product_base<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , >}::derived’ in ‘Eigen::ProductImpl<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , Eigen::Dense>::Base {aka class Eigen::internal::dense_product_base<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , >}’
using Base::derived; \
^
/usr/include/eigen3/Eigen/src/Core/util/Macros.h::: note: in expansion of macro ‘EIGEN_GENERIC_PUBLIC_INTERFACE’
EIGEN_GENERIC_PUBLIC_INTERFACE(Derived) \
^
/usr/include/eigen3/Eigen/src/Core/Product.h::: note: in expansion of macro ‘EIGEN_DENSE_PUBLIC_INTERFACE’
EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
^
/usr/include/eigen3/Eigen/src/Core/util/Macros.h::: error: no members matching ‘Eigen::ProductImpl<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , Eigen::Dense>::Base {aka Eigen::internal::dense_product_base<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , >}::const_cast_derived’ in ‘Eigen::ProductImpl<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , Eigen::Dense>::Base {aka class Eigen::internal::dense_product_base<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , >}’
using Base::const_cast_derived;
^
/usr/include/eigen3/Eigen/src/Core/util/Macros.h::: note: in expansion of macro ‘EIGEN_GENERIC_PUBLIC_INTERFACE’
EIGEN_GENERIC_PUBLIC_INTERFACE(Derived) \
^
/usr/include/eigen3/Eigen/src/Core/Product.h::: note: in expansion of macro ‘EIGEN_DENSE_PUBLIC_INTERFACE’
EIGEN_DENSE_PUBLIC_INTERFACE(Derived)
^
/usr/include/eigen3/Eigen/src/Core/Product.h: In instantiation of ‘class Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, >’:
/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp::: required from here
/usr/include/eigen3/Eigen/src/Core/util/Macros.h::: error: no members matching ‘Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, >::Base {aka Eigen::internal::dense_product_base<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , >}::derived’ in ‘Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, >::Base {aka class Eigen::internal::dense_product_base<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , >}’
using Base::derived; \
^
/usr/include/eigen3/Eigen/src/Core/Product.h::: note: in expansion of macro ‘EIGEN_GENERIC_PUBLIC_INTERFACE’
EIGEN_GENERIC_PUBLIC_INTERFACE(Product)
^
/usr/include/eigen3/Eigen/src/Core/util/Macros.h::: error: no members matching ‘Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, >::Base {aka Eigen::internal::dense_product_base<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , >}::const_cast_derived’ in ‘Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, >::Base {aka class Eigen::internal::dense_product_base<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, , >}’
using Base::const_cast_derived;
^
/usr/include/eigen3/Eigen/src/Core/Product.h::: note: in expansion of macro ‘EIGEN_GENERIC_PUBLIC_INTERFACE’
EIGEN_GENERIC_PUBLIC_INTERFACE(Product)
^
/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp: In function ‘int main(int, char**)’:
/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp::: error: conversion from ‘const Eigen::Product<Eigen::Matrix<float, , >, Eigen::Matrix<double, , >, >’ to non-scalar type ‘Eigen::Matrix<double, , >’ requested
Eigen::Matrix<double, , > result_wrong_type = matrix_23 * v_3d;
^
CMakeFiles/eigenMatrix.dir/build.make:: recipe for target 'CMakeFiles/eigenMatrix.dir/eigenMatrix.cpp.o' failed
make[]: *** [CMakeFiles/eigenMatrix.dir/eigenMatrix.cpp.o] Error
CMakeFiles/Makefile2:: recipe for target 'CMakeFiles/eigenMatrix.dir/all' failed
make[]: *** [CMakeFiles/eigenMatrix.dir/all] Error
Makefile:: recipe for target 'all' failed
make: *** [all] Error
*** Failure: Exit code ***
问题分析:
在Eigen中不能混合两种不同类型的矩阵,Eigen不会执行自动类型转换,需要手动进行显式转换。
编译如下代码即会得到上述错误,
Eigen::Matrix<float, , > matrix_23;
Eigen::Vector3d v_3d; matrix_23 << , , , , , ;
v_3d << , , ; Eigen::Matrix<double, , > result_ = matrix_23 * v_3d;
更正代码如下,
Eigen::Matrix<float, , > matrix_23;
Eigen::Vector3d v_3d; matrix_23 << , , , , , ;
v_3d << , , ; Eigen::Matrix<double, , > result_ = matrix_23.cast<double>() * v_3d; // 显式类型转换
2. 矩阵维度报错
/home/wy/workdir/slambook/ch3/useEigen/build> make -j2
Scanning dependencies of target eigenMatrix
[ %] Building CXX object CMakeFiles/eigenMatrix.dir/eigenMatrix.cpp.o
In file included from /usr/include/eigen3/Eigen/Core::,
from /home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp::
/usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h: In instantiation of ‘void Eigen::internal::call_assignment_no_alias(Dst&, const Src&, const Func&) [with Dst = Eigen::Matrix<double, , , , , >; Src = Eigen::Product<Eigen::CwiseUnaryOp<Eigen::internal::scalar_cast_op<float, double>, const Eigen::Matrix<float, , > >, Eigen::Matrix<double, , >, >; Func = Eigen::internal::assign_op<double>]’:
/usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h::: required from ‘Derived& Eigen::PlainObjectBase<Derived>::_set_noalias(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Product<Eigen::CwiseUnaryOp<Eigen::internal::scalar_cast_op<float, double>, const Eigen::Matrix<float, , > >, Eigen::Matrix<double, , >, >; Derived = Eigen::Matrix<double, , , , , >]’
/usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h::: required from ‘Eigen::PlainObjectBase<Derived>::PlainObjectBase(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Product<Eigen::CwiseUnaryOp<Eigen::internal::scalar_cast_op<float, double>, const Eigen::Matrix<float, , > >, Eigen::Matrix<double, , >, >; Derived = Eigen::Matrix<double, , , , , >]’
/usr/include/eigen3/Eigen/src/Core/Matrix.h::: required from ‘Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::Matrix(const Eigen::EigenBase<OtherDerived>&) [with OtherDerived = Eigen::Product<Eigen::CwiseUnaryOp<Eigen::internal::scalar_cast_op<float, double>, const Eigen::Matrix<float, , > >, Eigen::Matrix<double, , >, >; _Scalar = double; int _Rows = ; int _Cols = ; int _Options = ; int _MaxRows = ; int _MaxCols = ]’
/home/wy/workdir/slambook/ch3/useEigen/eigenMatrix.cpp::: required from here
/usr/include/eigen3/Eigen/src/Core/util/StaticAssert.h::: error: ‘YOU_MIXED_MATRICES_OF_DIFFERENT_SIZES’ is not a member of ‘Eigen::internal::static_assertion<false>’
if (Eigen::internal::static_assertion<static_cast<bool>(CONDITION)>::MSG) {}
^
/usr/include/eigen3/Eigen/src/Core/util/StaticAssert.h::: note: in expansion of macro ‘EIGEN_STATIC_ASSERT’
EIGEN_STATIC_ASSERT( \
^
/usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h::: note: in expansion of macro ‘EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE’
EIGEN_STATIC_ASSERT_SAME_MATRIX_SIZE(ActualDstTypeCleaned,Src)
^
CMakeFiles/eigenMatrix.dir/build.make:: recipe for target 'CMakeFiles/eigenMatrix.dir/eigenMatrix.cpp.o' failed
make[]: *** [CMakeFiles/eigenMatrix.dir/eigenMatrix.cpp.o] Error
CMakeFiles/Makefile2:: recipe for target 'CMakeFiles/eigenMatrix.dir/all' failed
make[]: *** [CMakeFiles/eigenMatrix.dir/all] Error
Makefile:: recipe for target 'all' failed
make: *** [all] Error
*** Failure: Exit code ***
问题分析:
当矩阵运算的行和列不匹配时,即会出现上述报错,代码如下,
Eigen::Matrix<float, , > matrix_23;
Eigen::Vector3d v_3d; matrix_23 << , , , , , ;
v_3d << , , ; Eigen::Matrix<double, , > result_ = matrix_23.cast<double>() * v_3d;
解决方案
Eigen::Matrix<double, , > result_ = matrix_23.cast<double>() * v_3d;
3. 数据类型报错
/usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h: In instantiation of ‘void Eigen::internal::call_assignment_no_alias(Dst&, const Src&, const Func&) [with Dst = Eigen::Matrix<float, , >; Src = Eigen::Matrix<double, , >; Func = Eigen::internal::assign_op<float>]’:
/usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h::: required from ‘Derived& Eigen::PlainObjectBase<Derived>::_set_noalias(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Matrix<double, , >; Derived = Eigen::Matrix<float, , >]’
/usr/include/eigen3/Eigen/src/Core/PlainObjectBase.h::: required from ‘Eigen::PlainObjectBase<Derived>::PlainObjectBase(const Eigen::DenseBase<OtherDerived>&) [with OtherDerived = Eigen::Matrix<double, , >; Derived = Eigen::Matrix<float, , >]’
/usr/include/eigen3/Eigen/src/Core/Matrix.h::: required from ‘Eigen::Matrix<_Scalar, _Rows, _Cols, _Options, _MaxRows, _MaxCols>::Matrix(const Eigen::EigenBase<OtherDerived>&) [with OtherDerived = Eigen::Matrix<double, , >; _Scalar = float; int _Rows = ; int _Cols = ; int _Options = ; int _MaxRows = ; int _MaxCols = ]’
/home/gordon/ros_ws/src/ndtMap/src/ndtmap_2frame.cpp::: required from here
/usr/include/eigen3/Eigen/src/Core/util/StaticAssert.h::: error: static assertion failed: YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY
#define EIGEN_STATIC_ASSERT(X,MSG) static_assert(X,#MSG);
^
/usr/include/eigen3/Eigen/src/Core/util/XprHelper.h::: note: in expansion of macro ‘EIGEN_STATIC_ASSERT’
EIGEN_STATIC_ASSERT((internal::functor_is_product_like<BINOP>::ret \
^
/usr/include/eigen3/Eigen/src/Core/AssignEvaluator.h::: note: in expansion of macro ‘EIGEN_CHECK_BINARY_COMPATIBILIY’
EIGEN_CHECK_BINARY_COMPATIBILIY(Func,typename ActualDstTypeCleaned::Scalar,typename Src::Scal
问题分析
初步猜想是数据类型错误,然而错误藏得比较深,一直没有排查出来。最后终于发现原因如下,
程序中创建了一个 pcl::NormalDistributionsTransform 对象NDT,该对象的成员函数需要接收一个4x4的矩阵变量。
于是乎,随手就创建了一个 Eigen::Matrix4d 类型的变量。
通过检查定义 pcl::NormalDistributionsTransform 类的头文件,发现其成员函数默认接收的4x4矩阵变量居然是float!
解决方案:
更改矩阵变量的数据类型,如下所示,
Eigen::Matrix4f init_guess;
init_guess = Eigen::Matrix4f::Identity();
使用Eigen遇到恶心报错的更多相关文章
- 编译依赖ndt_gpu库的包,遇到Eigen报错
背景: 使用NDT建图,帧率比较慢,打算使用gpu加速计算. ndt_gpu是一个使用gpu加速ndt计算的库,首先在工作空间编译这个包. 然后在ndtMap包中链接这个库,其CMakelists.t ...
- iOS报错Expected selector for Objective-C method
这个报错非常恶心:原因竟然是在导入头文件的地方多写了一个"+"号,可能问题在一个文件,报错在另一个文件
- dubbo控制器xml文件报错
在配置dubbo服务的过程中,经常会遇到虽然程序能够跑起来,但是配置文件一堆红叉,虽然不影响功能,但是确实很让人恶心. 报错信息如下: Multiple annotations found at th ...
- (已解决) eclipse提示报错"serializing cdt project settings"解决方案
最近在使用eclipse作为cocos2dx的交叉编译工具.但是某天突然相关工程打不开,打开eclipse直接提示 “serializing cdt project settings” has enc ...
- 关于dubbo服务的xml配置文件报错的问题
在配置dubbo服务的过程中,经常会遇到虽然程序能够跑起来,但是配置文件一堆红叉,虽然不影响功能,但是确实很让人恶心. 报错信息如下: Multiple annotations found at th ...
- Google Review中Zlib.Portable报错的一种排查解决方案
前几天遇到一个恶心的问题,跟同事一块解决了,在这里记录下过程. 比较懒,直接转他的blog: http://www.cnblogs.com/caochenghua/p/6530053.html 报错信 ...
- Skype坑爹报错:“旧版本无法删除,请联络您的技术支持小组 ”的解决办法
真是恶心的让人想吐的报错.现在终于解决了,跟大家分享一下方法. 先给问题截个图,如下 首先当我去搜解决办法之前,我已经在[控制面板]的[卸载程序]里把Skype删除了,真是让我后悔不已的操作啊!!因为 ...
- Exception occurred during processing request: null报错
报错, 恶心的一笔. 报错的地方 解决方法: 没注意到...
- SSM整合报错org.springframework.beans.factory.UnsatisfiedDependencyException
我解决的办法是把.m2仓库所有文件删除,重新maven project就可以了. 但是在做这一步之前,报错如下: ①org.springframework.beans.factory.Unsatisf ...
随机推荐
- CF498B Name That Tune(动态规划dp)
CF498B 动态规划f[i][j]表示前i秒时间听了j首歌的概率,则有: \(f[i][j]=∑f[i-k][j-1]*(1-p_j)^{k-1}*p_j\) k枚举i秒前的每一秒,要求前i-1秒都 ...
- 【转】【mysql面试】https://blog.csdn.net/hanfazy/article/details/14520437
公司招聘MySQL DBA,也面试了10个2年MySQL DBA工作经验的朋友,谈谈自己的心得,欢迎大家指点. 1 2年MySQL DBA经验 其中许多有水分,一看到简历自我介绍,说公司项目的时 ...
- TCP listener
调试时未关闭之前开启的TCP SERVER: 应该关闭: TcpListener TcpClient 1.开启TCP listener (1)Start()方法失败 异常位置:该异常的产生位置为 tc ...
- SSM笔记
Spring Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象.也可以称之为项目中的粘合剂. Spring的核心思想是IoC(控制 ...
- 【洛谷P1119题解】灾后重建——(floyd)
这道题告诉我,背的掉板子并不能解决一切问题,理解思想才是关键,比如不看题解,我确实想不清楚这题是弗洛伊德求最短路 (我不该自不量力的说我会弗洛伊德了我错了做人果然要谦虚) 灾后重建 题目背景 B地区在 ...
- Android API文档
官方API文档: Android官网: https://developer.android.google.cn/index.html (不需要梯子) Android官网: https://develo ...
- py之包和日志
第一章 包 只要文件夹下含有__init__.py文件就是一个包 回想一下,之前我们没有学习模块的时候将一个整体的功能写入到文件中,为了能够充分的将某个功能进行重用 我们使用了模块,但是慢慢的模块就会 ...
- java 线程池 - ThreadPoolExecutor
1. 为什么要用线程池 减少资源的开销 减少了每次创建线程.销毁线程的开销. 提高响应速度 ,每次请求到来时,由于线程的创建已经完成,故可以直接执行任务,因此提高了响应速度. 提高线程的可管理性 ,线 ...
- JavaSE--面向对象
面向对象(Object Oriented) 面向对象是一种思想,是基于面向过程而言的,就是说面向对象是将功能等通过对象来实现,将功能封装进对象之中,让对象去实现具体的细节:这种思想是将数据作为第一位, ...
- nginx 针对特定地区的ip进行规则匹配
使用geoip模块,加载ip库 geoip_country GeoIP.dat; geoip_city GeoLiteCity.dat; 转自http://ju.outofmemory.cn/entr ...