【发布时间】:2020-11-26 09:30:48
【问题描述】:
我正在尝试将 CppAD 标量类型与 Eigen 一起使用。
以下编译失败:
#include <Eigen/Dense>
#include <cppad/cppad.hpp>
#include <cppad/example/cppad_eigen.hpp>
int main()
{
using Scalar = CppAD::AD<double>;
//using Scalar = double;
Eigen::Matrix<Scalar, 1,4> row;
Eigen::Matrix<Scalar, 4,1> col;
Scalar scalar = 5;
Scalar res2 = row * col + scalar; //fails
return 0;
}
错误基本上是它不能将标量添加到乘法的结果中。但是,乘法的结果本身就是一个标量,所以应该不成问题。事实上,当使用double 作为Scalar 类型时,没有问题。
这是编译器错误:
cppad-eigen-problem.cpp:14:29: error: no match for ‘operator+’ (operand types are ‘const Eigen::Product<Eigen::Matrix<CppAD::AD<double>, 1, 4>, Eigen::Matrix<CppAD::AD<double>, 4, 1, 0, 4, 1>, 0>’ and ‘Scalar’ {aka ‘CppAD::AD<double>’})
14 | Scalar res2 = row * col + scalar; //fails
| ~~~~~~~~~ ^ ~~~~~~
| | |
| | Scalar {aka CppAD::AD<double>}
| const Eigen::Product<Eigen::Matrix<CppAD::AD<double>, 1, 4>, Eigen::Matrix<CppAD::AD<double>, 4, 1, 0, 4, 1>, 0>
有一个issue on the CppAD project,但我不确定问题出在哪里:
-
如果我使用另一个微不足道的自定义标量,我将无法重现错误...
-
另一方面,CppAD Eigen traits 的标量类型在我看来还可以。
版本:Eigen 3.3.7,CppAD 最新大师,g++ 9.3.0
有什么线索吗?
谢谢
【问题讨论】:
-
我同意 NumTraits 似乎满足here 列出的要求。虽然这不能回答您的潜在问题,但请注意避免使用
Product类型可以解决您的问题:Scalar res2 = row.adjoint().dot(col) + scalar; // works -
谢谢。是的,其他解决方法也是可能的,比如使用
value(),因为我知道结果是一个标量:(row * col).value() + scalar。但是,这对我来说是不可行的,因为我有很多已经编写好的代码,可以很好地与double配合使用。
标签: c++ linear-algebra eigen