使用Arrayfi在Python中快速求幂复杂数组

2024-04-28 19:45:22 发布

您现在位置:Python中文网/ 问答频道 /正文

根据arrayfire pow documentationaf.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

有没有比这更快的并行元素求幂方法?我还没找到,但是我害怕我错过了一个窍门。。。在


Tags: 函数内存documentation错误数组realafpower
1条回答
网友
1楼 · 发布于 2024-04-28 19:45:22

如果没有并行for循环,速度会更快一些:

def complexPow(inData, power):
    theta = af.atan(af.imag(inData)/af.real(inData))
    r = af.pow(af.pow(af.real(inData), 2.0) + 
                af.pow(af.imag(inData), 2.0), .5)
    inData = af.pow(r, power) * (af.cos(theta*power) + \
                1j*af.sin(theta*power))
    return inData

使用nvidia Quadro K4200、Spyder 3、Python 2.7、Windows 7,在一个dtype=complex数组上进行4000次迭代测试:

使用af.ParallelRange7.64秒(每次迭代1.91毫秒)。在

上述方法:5.94秒(每次迭代1.49毫秒)。在

提速:28%。在

相关问题 更多 >