如何在Eigen中把双倍数提高到数组幂数?

问题描述 投票:2回答:2

我有一个很简单的问题,应该也有一个简单的答案,但到目前为止还没有找到答案。

我需要将一个双倍值提升到一个整数幂的数组中,在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并不是这样?

总之,如果能在这里说清楚,我将非常感激。

c++ arrays eigen
2个回答
1
投票

简单地将每个 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 沿途,这个副本可以省略。


0
投票

可以用下面的代码来实现。

Eigen::ArrayXd N = Eigen::pow(2, Eigen::ArrayXd::LinSpaced(10, 1, 10));

数组N将包含: 2,4,8,16,32,64,128,256,512,1024。

© www.soinside.com 2019 - 2024. All rights reserved.