c++11 - 如何在 Eigen 中使用元素智能整数幂
问题描述
我想使用 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;
解决方案
如错误消息所示,您不能隐式混合标量类型。您必须显式转换以使类型匹配:
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
推荐阅读
- python - 如何找到要在项目中使用的标头?
- php - 为什么 get_call_class() 从不同对象进行静态调用后报告错误结果?
- ios - xcrun 中缺少 iphone sdk 如何从命令行为 iphone 构建?
- sql - 旋转两列
- javascript - document.querySelectorAll :not with multiple :not(s)
- graph-theory - 解决 3 组而不是 2 组的分配问题
- angular - 如何将信息从一个组件传递到Angular 2+中的嵌套子组件?
- r - 在 R 中创建函数以应用于多个数据集
- docker - 不确定如何编排 docker 容器
- eloquent - 使用与其他几个模型的多对多关系的单个模型