2017-08-14 9 views
2

Eigenfadbadを自動判別に使用します。ファンドバッド付き固有ベクトル

私は2つのベクトル

#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. 
       ~~^~~ 

私はスカラー型としてdoubleを使用する場合、それはコンパイルと実行エラーなし。

どうすればこの問題を解決できますか?

+0

コンパイラが出力する他の注釈はありますか?ビルドエラーに関する質問を投稿するときには、*完全な出力を必ず入力してください。好ましくはコピーペーストされる。完全な出力を含めるように質問を編集してください。 –

+0

ちょっと推測する(固有値かファットバッドを知らない):2番目と3番目のテンプレートパラメータが行列の次元ならば、未定義のx1を未定義のx1の行列でmutliplyしようとしている – user463035818

+0

'Eigen :: Matrix user463035818

答えて

1

これはよくある問題です。fadbadは一般的な暗黙的なコンストラクタを公開していて、すべてから変換できるかのようにしていると思います。より正確にはstd::is_convertible<X, fadbad>XのいずれのタイプでもEigen::Matrix<fadbad>を含むtrueを返します。したがって、a * bでは、因子の1つは互換性のあるスカラーとして解釈されます。

たとえば、SFINAEを使用して有効なタイプに対してのみ一般的なctorを有効にするには、fadbadに固定する必要があります。

関連する問題