(从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包装的经验,我也很感兴趣。
提前致谢。
答案 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
我确定你知道,这只有效,因为你已经做到了这一点,complex
和fftw_complex
的大小相同。
<强>附录强>
鉴于fftw_complex
和complex
具有完全相同的内存布局,最简单的解决方案就是告诉Cython fftw_
函数处理complex*
而不是{{} 1}}。它实际上并没有查看C文件来检查这是否属实 - 它只是用它来进行类型转换和内存分配(两者都应该没问题)
fftw_complex*
(在C编译步骤中,您确实会收到有关不兼容指针类型的警告,但它只是一个警告,并且您知道这些类型实际上是兼容的。)