将fftw_complex指针(又名double [2])转换为cython复杂的memoryview

时间:2015-05-12 18:30:56

标签: cython fftw

(从cython用户交叉发布)

我正在尝试将FFTW用于某些Cython代码。尝试将指向fftw_complex(一个typedef to double [2])的指针转换为复杂的内存视图时,我遇到了问题,即(最小示例)

cdef extern from "fftw3.h":
    ctypedef double fftw_complex[2]
    fftw_complex* fftw_alloc_complex(int N)

cdef foo(complex[::1] input):
    complex_ny = fftw_alloc_complex(input.size)
    (<complex[:self.ny]>complex_ny)[:] = input
    # actual call to FFTW follows

在演员阵容中失败:“hmm.pyx:8:34:指针基类型与cython.array基类型不匹配”(也许Cython不能指望double [2]可以转换为复杂,但......我还能做什么?)

PS:如果有人有直接从Cython使用pyFFTW包装的经验,我也很感兴趣。

提前致谢。

1 个答案:

答案 0 :(得分:1)

它抱怨complex_ny的类型与complex不同(并且它不知道转换)。如果您先将complex_ny转换为complex*,然后将指针指定给内存视图,那就更快乐了:

complex_ny = fftw_alloc_complex(input.size)
cdef complex[::1] view_of_complex_ny = <complex[:input.size]>(<complex*>complex_ny)
view_of_complex_ny[:] = input

我确定你知道,这只有效,因为你已经做到了这一点,complexfftw_complex的大小相同。

<强>附录

鉴于fftw_complexcomplex具有完全相同的内存布局,最简单的解决方案就是告诉Cython fftw_函数处理complex*而不是{{} 1}}。它实际上并没有查看C文件来检查这是否属实 - 它只是用它来进行类型转换和内存分配(两者都应该没问题)

fftw_complex*

(在C编译步骤中,您确实会收到有关不兼容指针类型的警告,但它只是一个警告,并且您知道这些类型实际上是兼容的。)