Согласно документации по 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
Есть ли более быстрый способ выполнить параллельное поэлементное возведение в степень, чем этот? Я не нашел ни одного, но боюсь, что упускаю здесь хитрость ...