2015-05-12 30 views
0

(从用Cython用户跨张贴)铸造fftw_complex指针(又名双[2]),以用Cython复杂memoryview

我试图使用FFTW一些用Cython代码。我想一个指针转换为一个fftw_complex当运行到的问题(一个typedef加倍[2])到复杂的memoryview,即(小例子)

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

这是抱怨它的complex_ny的类型是不一样的complex(它不知道转换)。如果你投complex_nycomplex*第一,然后将鼠标指针赋值给一个memoryview它的快乐:

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*而不是fftw_complex*。它实际上并没有看C文件来检查这是真的 - 它只是使用它进行类型转换和内存分配(这两者应该是OK)

cdef extern from "fftw3.h": 
    complex* fftw_alloc_complex(int N) 

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

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