2015-05-12 37 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編譯步驟中不兼容的指針類型,但它只是一個警告,並且您知道類型實際上是兼容的。)