2017-08-14 305 views
2

我想使用Eigenfadbad自動區分。特徵向量與fadbad

當我乘兩個矢量

#include <iostream> 
#include <fadiff.h> 
#include <Eigen/Core> 

int main(int argc, char *argv[]) 
{ 
    using Scalar = fadbad::F<double>; 
    using VectorXs = Eigen::Matrix<Scalar, Eigen::Dynamic, 1>; 

    VectorXs a(2); 
    VectorXs b(2); 

    Scalar c = a.transpose() * b; 

    std::cout << c.x() << std::endl; 
} 

我得到以下的錯誤消息(忍者建造,GCC-7.1):

[1/2] Building CXX object CMakeFiles/example.dir/src/main.cc.o 
FAILED: CMakeFiles/example.dir/src/main.cc.o 
/usr/bin/c++ -I/home/username/include/boost-1.64.0 -I/home/username/include/eigen-3.3.4 -I/home/username/include/fadbad-2.1 -I/home/username/include/termcolor-6267b85 -g -MD -MT CMakeFiles/example.dir/src/main.cc.o -MF CMakeFiles/example.dir/src/main.cc.o.d -o CMakeFiles/example.dir/src/main.cc.o -c ../src/main.cc 
../src/main.cc: In function ‘int main(int, char**)’: 
../src/main.cc:13:30: error: ambiguous overload for ‘operator*’ (operand types are ‘Eigen::Transpose<Eigen::Matrix<fadbad::F<double>, -1, 1> >’ and ‘VectorXs {aka Eigen::Matrix<fadbad::F<double>, -1, 1>}’) 
    Scalar c = a.transpose() * b; 
       ~~~~~~~~~~~~~~^~~ 
In file included from /home/username/include/eigen-3.3.4/Eigen/Core:72:0, 
       from ../src/main.cc:3: 
/home/username/include/eigen-3.3.4/Eigen/src/Core/../plugins/CommonCwiseBinaryOps.h:50:29: note: candidate: typename Eigen::internal::enable_if<true, const Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<typename Eigen::internal::traits<T>::Scalar, typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::scalar_product_op<typename Eigen::internal::traits<T>::Scalar, T> > >::value>::type>, const Derived, const typename Eigen::internal::plain_constant_type<Derived, typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::scalar_product_op<typename Eigen::internal::traits<T>::Scalar, T> > >::value>::type>::type> >::type Eigen::MatrixBase<Derived>::operator*(const T&) const [with T = Eigen::Matrix<fadbad::F<double>, -1, 1>; Derived = Eigen::Transpose<Eigen::Matrix<fadbad::F<double>, -1, 1> >; typename Eigen::internal::enable_if<true,const Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<typename Eigen::internal::traits<T>::Scalar, typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::scalar_product_op<typename Eigen::internal::traits<T>::Scalar, T> > >::value>::type>, const Derived, const typenameEigen::internal::plain_constant_type<Derived, typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::scalar_product_op<typename Eigen::internal::traits<T>::Scalar, T> > >::value>::type>::type> >::type = const Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<fadbad::F<double>, fadbad::F<double> >, const Eigen::Transpose<Eigen::Matrix<fadbad::F<double>, -1, 1> >, const Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<fadbad::F<double> >, const Eigen::Matrix<fadbad::F<double>, 1, -1, 1, 1, -1> > >] 
EIGEN_MAKE_SCALAR_BINARY_OP(operator*,product) 
          ^
/home/username/include/eigen-3.3.4/Eigen/src/Core/util/Macros.h:941:4: note: in definition of macro ‘EIGEN_MAKE_SCALAR_BINARY_OP_ONTHERIGHT’ 
    (METHOD)(const T& scalar) const { \ 
    ^~~~~~ 
/home/username/include/eigen-3.3.4/Eigen/src/Core/../plugins/CommonCwiseBinaryOps.h:50:1: note: in expansion of macro ‘EIGEN_MAKE_SCALAR_BINARY_OP’ 
EIGEN_MAKE_SCALAR_BINARY_OP(operator*,product) 
^~~~~~~~~~~~~~~~~~~~~~~~~~~ 
In file included from /home/username/include/eigen-3.3.4/Eigen/Core:462:0, 
       from ../src/main.cc:3: 
/home/username/include/eigen-3.3.4/Eigen/src/Core/GeneralProduct.h:387:1: note: candidate: const Eigen::Product<Derived, OtherDerived> Eigen::MatrixBase<Derived>::operator*(const Eigen::MatrixBase<OtherDerived>&) const [with OtherDerived = Eigen::Matrix<fadbad::F<double>, -1, 1>; Derived = Eigen::Transpose<Eigen::Matrix<fadbad::F<double>, -1, 1> >] 
MatrixBase<Derived>::operator*(const MatrixBase<OtherDerived> &other) const 
^~~~~~~~~~~~~~~~~~~ 
In file included from /home/username/include/eigen-3.3.4/Eigen/Core:72:0, 
       from ../src/main.cc:3: 
/home/username/include/eigen-3.3.4/Eigen/src/Core/../plugins/CommonCwiseBinaryOps.h:50:29: note: candidate: typename Eigen::internal::enable_if<true, const Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<T, typename Eigen::internal::traits<T>::Scalar, Eigen::internal::scalar_product_op<T, typename Eigen::internal::traits<T>::Scalar> > >::value>::type, typename Eigen::internal::traits<T>::Scalar>, const typename Eigen::internal::plain_constant_type<Derived, typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<T, typename Eigen::internal::traits<T>::Scalar, Eigen::internal::scalar_product_op<T, typename Eigen::internal::traits<T>::Scalar> > >::value>::type>::type, const Derived> >::type Eigen::operator*(const T&, const StorageBaseType&) [with T = Eigen::Transpose<Eigen::Matrix<fadbad::F<double>, -1, 1> >; Derived = Eigen::Matrix<fadbad::F<double>, -1, 1>; typename Eigen::internal::enable_if<true, const Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<T, typename Eigen::internal::traits<T>::Scalar, Eigen::internal::scalar_product_op<T, typename Eigen::internal::traits<T>::Scalar> > >::value>::type, typename Eigen::internal::traits<T>::Scalar>, const typename Eigen::internal::plain_constant_type<Derived, typename Eigen::internal::promote_scalar_arg<typename Eigen::internal::traits<T>::Scalar, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<T, typename Eigen::internal::traits<T>::Scalar, Eigen::internal::scalar_product_op<T, typename Eigen::internal::traits<T>::Scalar> > >::value>::type>::type, const Derived> >::type = const Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<fadbad::F<double>, fadbad::F<double> >, const Eigen::CwiseNullaryOp<Eigen::internal::scalar_constant_op<fadbad::F<double> >, const Eigen::Matrix<fadbad::F<double>, -1, 1> >, const Eigen::Matrix<fadbad::F<double>, -1, 1> >; Eigen::MatrixBase<Derived>::StorageBaseType = Eigen::MatrixBase<Eigen::Matrix<fadbad::F<double>, -1, 1> >] 
EIGEN_MAKE_SCALAR_BINARY_OP(operator*,product) 
          ^
/home/username/include/eigen-3.3.4/Eigen/src/Core/util/Macros.h:950:4: note: in definition of macro ‘EIGEN_MAKE_SCALAR_BINARY_OP_ONTHELEFT’ 
    (METHOD)(const T& scalar, const StorageBaseType& matrix) { \ 
    ^~~~~~ 
/home/username/include/eigen-3.3.4/Eigen/src/Core/../plugins/CommonCwiseBinaryOps.h:50:1: note: in expansion of macro ‘EIGEN_MAKE_SCALAR_BINARY_OP’ 
EIGEN_MAKE_SCALAR_BINARY_OP(operator*,product) 
^~~~~~~~~~~~~~~~~~~~~~~~~~~ 
ninja: build stopped: subcommand failed. 
       ~~^~~ 

當我使用雙作爲標量型它可以編譯和運行沒有錯誤。

我該如何解決這個問題?

+0

編譯器是否輸出其他音符?發佈有關構建錯誤的問題時,請始終包含* full *輸出,完成後不做任何修改。最好複製粘貼。請編輯您的問題以包含完整的輸出。 –

+0

只是猜測(不知道特徵或fadbad):如果第二個和第三個模板參數是矩陣的維度,那麼您嘗試使用undefinedx1矩陣多次拉伸一個undefinedx1 – user463035818

+0

如果您使用Eigen :: Matrix user463035818

回答

1

這是一個常見問題,我想問題是fadbad暴露了一個通用的隱式構造函數,使得它可以從一切轉換。更確切地說,std::is_convertible<X, fadbad>對於任何類型X都會返回true,包括Eigen::Matrix<fadbad>。在a * b中,因此可以將其中一個因素解釋爲兼容的標量。

這必須在fadbad中修復,例如使用SFINAE爲通用ctor僅啓用有效類型。