1

根据arrayfire pow 文档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

有没有比这更快的方法来进行并行元素取幂?我还没有找到,但害怕我在这里错过了一个技巧......

4

1 回答 1

1

如果没有并行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 次迭代测试:(1, 2**18)

使用af.ParallelRange 7.64 秒(每次迭代 1.91 毫秒)。

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

速度提升: 28%。

于 2017-01-31T09:14:27.133 回答