我有一个很简单的问题,应该也有一个简单的答案,但到目前为止还没有找到答案。
我需要将一个双倍值提升到一个整数幂的数组中,在c++中,这看起来像这样
for (int i = 0; i < N; ++i)
{
y[i] = pow(delta, l[i]);
}
但是在Eigen中,我尝试了很多关于这个主题的变体,都没有成功。
我有一个 Eigen::ArrayXi l_intE
它映射了一个STL向量 l_int
.
这是不工作的。
Eigen::pow(double, l_intE)
因为 pow()
函数想要一个数组作为第一个输入,然后将数组提高到一个常数。
有一个讨厌的变通方法,我能够让它工作(这不可能是正确的方法),就是这样做。
(log(delta)*l_doubleE).exp()
这样就可以进行转换
pow(delta,L) -> exp(L*log(delta))
而我必须将整数转换成双数。 这对性能也没有帮助,因为 pow(double, int) 是 大大 比一般的pow(double,double)快。 虽然,也许在Eigen中的SSE并不是这样?
总之,如果能在这里说清楚,我将非常感激。
简单地将每个 y[i]
与自己 l[i]
倍?
y.fill(1);
for (ArrayXi e = l; (e>0).any(); e -= 1)
y = (e>0).select(delta*y, y);
请注意,每次乘法后,我们从指数中减去一个,当所有指数为零或更少时退出循环。由于这个算法修改指数数组是为了跟踪乘法次数,所以我们把它复制到for循环的初始化子句中。如果销毁 l
沿途,这个副本可以省略。
可以用下面的代码来实现。
Eigen::ArrayXd N = Eigen::pow(2, Eigen::ArrayXd::LinSpaced(10, 1, 10));
数组N将包含: 2,4,8,16,32,64,128,256,512,1024。