根据arrayfire pow documentation,af.pow()
目前只支持实数组的幂(和根…)。没有抛出错误,但是我发现在复杂的输入中使用af.pow()
会导致巨大的内存泄漏,特别是当其他函数用作输入时(例如,af.pow(af.ifft(array), 2)
)。在
为了解决这个问题,我在下面写了一个函数complexPow
。这似乎适用于没有内存泄漏的复杂数组,并且快速比较显示,我的complexPow
函数返回与numpy.sqrt()
和**
运算符相同的值。在
def complexPow(inData, power):
for i in af.ParallelRange(inData.shape[0]):
theta = af.atan(af.imag(inData[i])/af.real(inData[i]))
rSquared = af.pow(af.real(inData[i]), 2.0) + \
af.pow(af.imag(inData[i]), 2.0)
r = af.pow(rSquared, .5)
inData[i] = af.pow(r, power) * (af.cos(theta*power) + \
1j*af.sin(theta*power))
return inData
有没有比这更快的并行元素求幂方法?我还没找到,但是我害怕我错过了一个窍门。。。在
如果没有并行
for
循环,速度会更快一些:使用nvidia Quadro K4200、Spyder 3、Python 2.7、Windows 7,在一个
dtype=complex
数组上进行4000次迭代测试:使用
af.ParallelRange
:7.64秒(每次迭代1.91毫秒)。在上述方法:5.94秒(每次迭代1.49毫秒)。在
提速:28%。在
相关问题 更多 >
编程相关推荐