2017-01-30 8 views
1

arrayfire pow documentationによれば、af.pow()は現在、実際の配列の累乗(およびルーツ...)のみをサポートしています。エラーはスローされませんが、複雑な入力を伴うaf.pow()を使用すると、特に他の関数が入力として使用されている場合(たとえば、af.pow(af.ifft(array), 2))、メモリリークが大きくなることがあります。Arrayfireを使用したPythonでの複雑な配列の指数化の高速化

これを回避するために、私は以下の関数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 

これよりもパラレルに要素指数をべき乗する方法はありますか?私は1つを見つけたが、私はここにトリックを...欠けている怖がっていない

これは少し速く並列 forループなしで
+1

これは間違いなくバグのようです。これを[github](https://github.com/arrayfire/arrayfire-python/issues)で報告できますか? – aatish

+0

私はそうだと思いました。明日はやるだろう。私はメモリリークを示す最小の実例を持っています。 –

答えて

0

:とdtype=complexアレイの上

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 

Tetsted 4000回の反復のためにNVIDIAのQuadro K4200、スパイダー3、Pythonの2.7はWindows 7を使用して寸法(1, 2**18)af.ParallelRangeを使用

7.64秒(反復当たり1.91ミリ秒)。

上記の方法: 5.94秒(反復ごとに1.49ミリ秒)。

スピード増加: 28%。

関連する問題