【问题标题】:Casting fftw_complex pointer (aka double[2]) to cython complex memoryview将 fftw_complex 指针(又名 double [2])转换为 cython 复杂 memoryview
【发布时间】:2015-05-12 18:30:55
【问题描述】:

(来自 cython 用户的交叉发布)

我正在尝试将 FFTW 用于某些 Cython 代码。我在尝试将指向 fftw_complex(typedef 到 double[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: Pointer base type does not match cython.array base type”(也许 Cython 无法知道 double[2] 可以转换为复杂但是...我还能做什么?)

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

提前致谢。

【问题讨论】:

    标签: cython fftw


    【解决方案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* 而不是fftw_complex*。它实际上并没有查看 C 文件来检查这是真的 - 它只是将它用于类型转换和内存分配(两者都应该可以)

    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 编译步骤中收到有关不兼容指针类型的警告,但这只是一个警告,并且您知道类型实际上是兼容的。)

    【讨论】:

      猜你喜欢
      • 2011-05-11
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多