特征向量与fadbad
问题描述:
我想使用Eigen与fadbad自动区分。特征向量与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.
~~^~~
当我使用双作为标量型它可以编译和运行没有错误。
我该如何解决这个问题?
答
这是一个常见问题,我想问题是fadbad
暴露了一个通用的隐式构造函数,使得它可以从一切转换。更确切地说,std::is_convertible<X, fadbad>
对于任何类型X
都会返回true,包括Eigen::Matrix<fadbad>
。在a * b
中,因此可以将其中一个因素解释为兼容的标量。
这必须在fadbad
中修复,例如使用SFINAE为通用ctor仅启用有效类型。
编译器是否输出其他音符?发布有关构建错误的问题时,请始终包含* full *输出,完成后不做任何修改。最好复制粘贴。请编辑您的问题以包含完整的输出。 –
只是猜测(不知道特征或fadbad):如果第二个和第三个模板参数是矩阵的维度,那么您尝试使用undefinedx1矩阵多次拉伸一个undefinedx1 – user463035818
如果您使用Eigen :: Matrix
user463035818