参考博客: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. vultr vps 开启BBR加速 (CentOS 7)

    上个月买的vultr的vps 感觉看视频还是比较慢的 于是上网找教程开启BBR加速 在这里记录一下 以后可能会用到 BBR 是 Google 提出的一种新型拥塞控制算法,可以使 Linux 服务器显著 ...

  2. P1550打井

    这是USACO2008年的一道最小生成树题,感谢dzj老师那天教的图论. 要引渠让每一个村庄都可以接到水,然后从某一个村庄到另一个村庄修剪水道要花费w元,并且还要打井(至少一个)(而输入数据也包括了在 ...

  3. MacOS 下文件读取问题

    使用Xcode编写C++程序可以直接使用fstream读写文件,代码如下: const char* path1 = [path UTF8String];string filename = path1; ...

  4. Solution for automatic update of Chinese word segmentation full-text index in NEO4J

    Solution for automatic update of Chinese word segmentation full-text index in NEO4J 1. Sample data 2 ...

  5. SQL的编写顺序和执行顺序,以及空值处理,别名处理,转义字符处理

    SQL即结构化查询语言.也就是用来从数据库中操作数据的.数据总的来说就是增删改查CRUD. 一,sql的分类,大致有四类: 1)DDL : 数据定义语言 create alter drop trunc ...

  6. 2019-11-29-C#-在-8.0-对比-string-和-string_-的类型

    title author date CreateTime categories C# 在 8.0 对比 string 和 string? 的类型 lindexi 2019-11-29 8:59:0 + ...

  7. 这才是最完美SSD:性能满血发挥 万里挑一

    固态硬盘同质化日益严重,不同品牌的固态盘想要一决高下就只有靠品牌口碑与做工硬实力了. 最近影驰对他们的ONE系列固态硬盘产品进行了一波更新,推出了多种容量的ONE PCIe M.2 SSD,今天我们就 ...

  8. byteArray转换为double,int

    /*将int转为低字节在前,高字节在后的byte数组   b[0] = 11111111(0xff) & 01100001   b[1] = 11111111(0xff) & (n & ...

  9. HDU5840 Problem This world need more Zhu 分块 树剖

    给一颗n个点的有点权的树,有m个询问,对于每个询问u,v,k,首先将点u到点v的最短路径上的所有点按顺序编号,u的编号为1,求树链上所有点的新编号cnt满足cnt%k==0的点的权值的最大值.n,m, ...

  10. python中对RSA的加密和解密

    首先,生成一对密钥,并保存 def create_keys(): # 生成公钥和私钥 (pubkey, privkey) = rsa.newkeys(1024) pub = pubkey.save_p ...