首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Arrayfire实现Python中复杂数组的快速幂运算

用Arrayfire实现Python中复杂数组的快速幂运算
EN

Stack Overflow用户
提问于 2017-01-30 18:16:55
回答 1查看 277关注 0票数 1

根据arrayfire pow文档af.pow()目前只支持权力(和根.)真正的数组。没有抛出错误,但我发现使用具有复杂输入的af.pow()会导致巨大的内存泄漏,特别是如果使用其他函数作为输入(例如,af.pow(af.ifft(array), 2))。

为了解决这个问题,我在下面编写了函数complexPow。这似乎是针对没有内存泄漏的复杂数组运行的,快速比较显示,我的complexPow函数返回与numpy.sqrt()**操作符相同的值。

代码语言:javascript
复制
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

有比这更快的并行元素幂的方法吗?我还没找到,但怕我错过了一个小把戏.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-31 09:14:27

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

代码语言:javascript
复制
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,Python2.7,Windows 7,测试了一个维度为(1, 2**18)(1, 2**18)数组上的4000次迭代:

使用af.ParallelRange**:** 7.64秒(每迭代1.91msec)。

上面的方法:5.94秒(每迭代1.49msec)。

增速: 28%。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41942757

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档