参考博客: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遇到恶心报错的更多相关文章

  1. 编译依赖ndt_gpu库的包,遇到Eigen报错

    背景: 使用NDT建图,帧率比较慢,打算使用gpu加速计算. ndt_gpu是一个使用gpu加速ndt计算的库,首先在工作空间编译这个包. 然后在ndtMap包中链接这个库,其CMakelists.t ...

  2. iOS报错Expected selector for Objective-C method

    这个报错非常恶心:原因竟然是在导入头文件的地方多写了一个"+"号,可能问题在一个文件,报错在另一个文件

  3. dubbo控制器xml文件报错

    在配置dubbo服务的过程中,经常会遇到虽然程序能够跑起来,但是配置文件一堆红叉,虽然不影响功能,但是确实很让人恶心. 报错信息如下: Multiple annotations found at th ...

  4. (已解决) eclipse提示报错"serializing cdt project settings"解决方案

    最近在使用eclipse作为cocos2dx的交叉编译工具.但是某天突然相关工程打不开,打开eclipse直接提示 “serializing cdt project settings” has enc ...

  5. 关于dubbo服务的xml配置文件报错的问题

    在配置dubbo服务的过程中,经常会遇到虽然程序能够跑起来,但是配置文件一堆红叉,虽然不影响功能,但是确实很让人恶心. 报错信息如下: Multiple annotations found at th ...

  6. Google Review中Zlib.Portable报错的一种排查解决方案

    前几天遇到一个恶心的问题,跟同事一块解决了,在这里记录下过程. 比较懒,直接转他的blog: http://www.cnblogs.com/caochenghua/p/6530053.html 报错信 ...

  7. Skype坑爹报错:“旧版本无法删除,请联络您的技术支持小组 ”的解决办法

    真是恶心的让人想吐的报错.现在终于解决了,跟大家分享一下方法. 先给问题截个图,如下 首先当我去搜解决办法之前,我已经在[控制面板]的[卸载程序]里把Skype删除了,真是让我后悔不已的操作啊!!因为 ...

  8. Exception occurred during processing request: null报错

    报错, 恶心的一笔. 报错的地方 解决方法: 没注意到...

  9. SSM整合报错org.springframework.beans.factory.UnsatisfiedDependencyException

    我解决的办法是把.m2仓库所有文件删除,重新maven project就可以了. 但是在做这一步之前,报错如下: ①org.springframework.beans.factory.Unsatisf ...

随机推荐

  1. linux c++ 实现http请求

    main.cpp #include HttpReq.h #include <string.h> int main(void) { HttpRequest* Http; char http_ ...

  2. Java第六周实验+总结

    一.实验目的 (1)掌握类的继承 1.子类继承父类中非private的成员变量和成员方法,同时,注意构造方法不能被子类继承. 2.定义类时若缺省extends关键字,则所定义的类为java.lang. ...

  3. sql server优化方向?

    系列转自KK:https://www.cnblogs.com/double-K/ Expert 诊断优化系列------------------你的CPU高么? Expert 诊断优化系列------ ...

  4. MySQL 用 limit 为什么会影响性能?

    一,前言 首先说明一下MySQL的版本: mysql> select version();+-----------+| version() |+-----------+| 5.7.17 |+-- ...

  5. C++学习——在C文件中调用C++文件中的函数

    1.CPP文件中的内容 #include "mytest.h" #include <iostream> using namespace std; int add(con ...

  6. homebrew学习(五)之homebrew cask和homebrew services

    homebrew cask 如果我想安装Chrome浏览器怎么办?试试下面的命令: brew install google-chrome 发现并不能安装,没有该软件.怎么办?好消息是一个叫做homeb ...

  7. JVM常用虚拟机命令汇总

    title: JVM常用虚拟机命令汇总 comments: false date: 2019-07-22 11:45:33 description: 总结一下常用的JVM虚拟机启动命令. catego ...

  8. vue-nuxt--切换布局文件

    1.暂时没有找到服务器端渲染 非服务器端切换: window.$nuxt.setLayout('blog')

  9. linux 桥接模式下 固定ip 设置

    DEVICE=eht0   #网卡名称BOOTPROTO=none #关闭自动获取  dhcp  IPADDR=192.168.0.178   #ip地址GATEWAY=192.168.0.1  DN ...

  10. 解释c# Peek 方法

    peek是用来确定你read的文件是否结束了,如果结束了会返回int型 -1 , 举个例子,你可以在输出每一行之前检查一下文件是否结尾,如果没结束就输出此行. StreamReader sr = ne ...