Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 定义C++;Cython中的结构返回类型 我编写了一个小型的C++库来模拟一个ODE系统,并使用Cython来封装一个初始化和解决系统的函数。C++函数包含少量参数,并返回包含两个矩阵的结构:一组用于构建系统的模式,以及在每个时间步长中的系统求解状态。_Python_C++_Cython - Fatal编程技术网

Python 定义C++;Cython中的结构返回类型 我编写了一个小型的C++库来模拟一个ODE系统,并使用Cython来封装一个初始化和解决系统的函数。C++函数包含少量参数,并返回包含两个矩阵的结构:一组用于构建系统的模式,以及在每个时间步长中的系统求解状态。

Python 定义C++;Cython中的结构返回类型 我编写了一个小型的C++库来模拟一个ODE系统,并使用Cython来封装一个初始化和解决系统的函数。C++函数包含少量参数,并返回包含两个矩阵的结构:一组用于构建系统的模式,以及在每个时间步长中的系统求解状态。,python,c++,cython,Python,C++,Cython,这些矩阵是使用库实现的,因此我使用接口将这些数据结构的底层内容传输到NumPy数组 在Python中,如果我返回这些矩阵之一的视图,一切都很好。但是,我想返回一个包含这两个矩阵的元组,这需要临时存储此结构,然后返回其每个矩阵成员: ## kernel.pyx from eigency.core cimport * cdef extern from "kernel_cpp.h": cdef cppclass network: MatrixXf state MatrixXf

这些矩阵是使用库实现的,因此我使用接口将这些数据结构的底层内容传输到NumPy数组

在Python中,如果我返回这些矩阵之一的视图,一切都很好。但是,我想返回一个包含这两个矩阵的元组,这需要临时存储此结构,然后返回其每个矩阵成员:

## kernel.pyx

from eigency.core cimport *

cdef extern from "kernel_cpp.h":

  cdef cppclass network:
    MatrixXf state
    MatrixXf patterns

  cdef network _run "run" (int N, int K, int P, double g, double T, double tau, double dt)

def run(N=10000, K=100, P=30, g=1.5, T=0.5, tau=1e-3, dt=1e-3):
  return ndarray_view(_run(N,K,P,g,T,tau,dt).state) # <--- This works
  # This does not:
  # cdef network net = _run(N,K,P,g,T,tau,dt):
  # return (ndarray_view(net.state), ndarray_view(net.patterns))
这对我来说很有意义——Cython正在尝试调用网络的构造函数。但是我希望构造在“run”中进行。这里正确的类型声明是什么

如果有帮助的话,可以使用代码的精简版本


谢谢值得知道Cython如何翻译堆栈分配C++变量的代码:

def run(N=10000, K=100, P=30, g=1.5, T=0.5, tau=1e-3, dt=1e-3):
   cdef network net = _run(N,K,P,g,T,tau,dt)
函数的内部将转换为:

{
    // start of function
    network net; // actually some mangled variable name (see your error message)

    // body of function
    net = _run(N,K,P,g,T,tau,dt);
}
i、 e.它需要一个默认构造函数和一个复制/移动赋值运算符。这不符合C++代码的编写方式,因此偶尔会产生问题。Cython通常假定存在这些构造函数(除非您告诉它其他构造函数),因此您不需要在
cdef CPPCCLASS
块中显式地写出它们

<>我认为您的错误信息是在编译C++代码时发生的,而不是定义默认构造函数。(以后的拷贝作业不应该是问题,因为C++会自动生成这个)。您有两个选择:

< L> > p>如果您乐意修改C++代码,那么定义一个默认构造函数。这将允许Cython代码按编写的方式工作。如果您使用的是>=C++11,那么这可能非常简单:

network() = default;
这可能不起作用,这取决于内部特征类型是否可以默认构造

<> >如果你不想修改C++代码,或者如果你不能很容易地定义一个默认构造函数,那么你必须修改Cython代码来分配<代码>网络<代码> > <代码>新< /Cord>。这也意味着您必须自己处理解除分配:

  # earlier
   cdef cppclass network:
     # need to tell Cython about copy constructor
     network(const network&)
     # everything else as before 

def run(N=10000, K=100, P=30, g=1.5, T=0.5, tau=1e-3, dt=1e-3):
    cdef network* net
    try:
        net = new network(_run(N,K,P,g,T,tau,dt))
        return (ndarray_view(net.state), ndarray_view(net.patterns))
    finally:
        del net
在这种情况下,不需要任何默认构造函数,只需要一个复制/移动构造函数(您无论如何都必须拥有该构造函数才能从函数返回
网络
)。注意最后使用
以确保释放内存


第一个选择奏效了,谢谢!即使在显式定义了复制/移动构造函数之后,我也无法让第二个开始工作
cdef network*net=新网络(_run(N,K,P,g,T,tau,dt)
将产生此错误:
调用的参数数量错误(预期为0,得到1)Cython编译器也不允许我在一个试块中使用CDEF。在第二个选项中我犯了两个错误。首先,您需要告诉Cython关于<代码>网络< /COD>复制构造函数(即使它只是一个默认C++),以便执行<代码>新网络(运行(…))。
。其次,您需要将
cdef
移出try块。为了确保答案正确,我更新了答案。不过,我可能还是会选择第一个选项。
  # earlier
   cdef cppclass network:
     # need to tell Cython about copy constructor
     network(const network&)
     # everything else as before 

def run(N=10000, K=100, P=30, g=1.5, T=0.5, tau=1e-3, dt=1e-3):
    cdef network* net
    try:
        net = new network(_run(N,K,P,g,T,tau,dt))
        return (ndarray_view(net.state), ndarray_view(net.patterns))
    finally:
        del net