在Cython中使用C ++复杂函数

迷航记

我正在尝试在Cython中做一个复杂的指数运算。

我已经能够将以下代码整合在一起pyx

from libc.math cimport sin, cos, acos, exp, sqrt, fabs, M_PI, floor, ceil

cdef extern from "complex.h":
    double complex cexp(double complex z)

import numpy as np
cimport numpy as np
import cython
from cython.parallel cimport prange, parallel

def try_cexp():
    cdef:
        double complex rr1
        double complex rr2
    rr1 = 1j
    rr2 = 2j

    print(rr1*rr2)

    #print(cexp(rr1))

请注意,print(cexp(rr1))已注释。当该行处于活动状态时,运行时出现以下错误setup.py

error: command 'C:\\WinPYthon\\Winpython-64bit-3.4.3.6\\python-3.4.3.amd64\\scripts\\gcc.exe' failed with exit status 1

请注意,当cexp被注释掉时,一切都会正常运行...我可以运行setup.py,并且在测试功能时,它会打印出两个复数的乘积。

这是我的setup.py档案。请注意,它包含openmp使用g ++在Cython中运行的代码:

from distutils.core import setup
from Cython.Build import cythonize
from distutils.extension import Extension
from Cython.Distutils import build_ext
import numpy as np
import os
os.environ["CC"] = "g++-4.7"
os.environ["CXX"] = "g++-4.7"

# These were added based on some examples I had seen of cexp in Cython. No effect.
#import pyximport
#pyximport.install(reload_support=True)

ext_modules = [
    Extension('complex_test',
              ['complex_test.pyx'],
              language="c++",
              extra_compile_args=['-fopenmp'],
              extra_link_args=['-fopenmp', '-lm'])  # Note that '-lm' was
              # added due to an example where someone mentioned g++ required
              # this. Same results with and without it.
    ]

setup(
    name='complex_test',
    cmdclass={'build_ext': build_ext},
    ext_modules=ext_modules,
    include_dirs=[np.get_include()]
    )

最终,我的目标是加快看起来k*exp(z)复杂kz复杂的计算。目前,我正在使用数值表达式,但是它具有很大的内存开销,并且我相信有可能进行更多的优化。

感谢您的帮助。

迪米特里斯·法萨拉基斯·希利亚德

您正在使用cexp的,而不是exp因为它是在C++更改cdef extern为:

cdef extern from "<complex.h>" namespace "std":
    double complex exp(double complex z)
    float complex exp(float complex z)  # overload

以及您的打印呼叫至:

print(exp(rr1))

它应该是一种魅力。


我知道编译消息很长,但是在那儿您可以找到指向罪魁祸首的错误:

complex_test.cpp: In function ‘PyObject* __pyx_pf_12complex_test_try_cexp(PyObject*)’:
complex_test.cpp:1270:31: error: cannot convert ‘__pyx_t_double_complex {aka std::complex<double>}’ to ‘__complex__ double’ for argument ‘1’ to ‘__complex__ double cexp(__complex__ double)’
   __pyx_t_3 = cexp(__pyx_v_rr1);

这很麻烦,但是您可以看到原因。*您正在为需要不同类型(函数提供C++定义的类型(__pyx_t_double_complex在Cython行话中)。C__complex__ double

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章