如何在Eigen中加倍阵列力量

我有一个非常简单的问题,应该有一个简单的答案,但到目前为止没有运气。

我需要将一个double值赋给一个整数幂的数组,在c ++中它看起来像这样

for (int i = 0; i < N; ++i)
{
    y[i] = pow(delta, l[i]);
}

但在Eigen中,我尝试了一些关于这个主题的变体,但没有成功。

我有一个映射STL向量l_intEigen::ArrayXi l_intE 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是可以的,这个副本可以省略。

链接地址: http://www.djcxy.com/p/85709.html

上一篇: How to raise double to array powers in Eigen

下一篇: Why can lambdas be better optimized by the compiler than plain functions?