如何在Eigen中加倍阵列力量
我有一个非常简单的问题,应该有一个简单的答案,但到目前为止没有运气。
我需要将一个double值赋给一个整数幂的数组,在c ++中它看起来像这样
for (int i = 0; i < N; ++i)
{
y[i] = pow(delta, l[i]);
}
但在Eigen中,我尝试了一些关于这个主题的变体,但没有成功。
我有一个映射STL向量l_int
的Eigen::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
是可以的,这个副本可以省略。
上一篇: How to raise double to array powers in Eigen
下一篇: Why can lambdas be better optimized by the compiler than plain functions?