我想使用Eigen幂函数来获取double数组和int数组的元素明智幂。
以下是使用Eigen v3.3.4和v3.3.7重现此问题的示例代码:
#include <Eigen/Dense>
int main() {
Eigen::ArrayXd x(10);
Eigen::ArrayXd res(10);
Eigen::ArrayXi exponents(10);
x = Eigen::ArrayXd::Random(10);
exponents = Eigen::ArrayXi::LinSpaced(10, 0, 9);
res = Eigen::pow(x, exponents);
return (0);
}
错误消息很长,但从本质上讲,我得到了
YOU_MIXED_DIFFERENT_NUMERIC_TYPES__YOU_NEED_TO_USE_THE_CAST_METHOD_OF_MATRIXBASE_TO_CAST_NUMERIC_TYPES_EXPLICITLY
在我看来与我无关的
Eigen3/Eigen/src/Core/functors/BinaryFunctors.h:294:84: error: no type named ‘ReturnType’ in ‘struct Eigen::ScalarBinaryOpTraits<double, int, Eigen::internal::scalar_pow_op<double, int> >’
typedef typename ScalarBinaryOpTraits<Scalar,Exponent,scalar_pow_op>::ReturnType result_type;
答案 0 :(得分:1)
如错误消息所示,您不能隐式混合标量类型。您必须显式强制转换,以使类型匹配:
res = Eigen::pow(x, exponents.cast<double>());
对于整数类型的专业化,幂函数(作为函子)的模板为:
template<typename ScalarX,typename ScalarY, bool IsInteger =
NumTraits<ScalarX>::IsInteger&&NumTraits<ScalarY>::IsInteger>
并调用简单的pow(x,y)
,除非两种类型都是整数(IsInteger
),在这种情况下会有不同的专业化。
数组的常量也有重载,这似乎并不是您要的内容。在这种情况下(除非ggael纠正了我),您绝对可以实施自己的CustomBinaryOp