Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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
呼叫C++;在python中使用特征库函数 我在C++的帮助下做了一些计算,函数是这样的: MatrixXd Cov(MatrixXd Data) { VectorXd meanVector; ... return Covariance; }_Python_C++_Matrix_Eigen_Python C Api - Fatal编程技术网

呼叫C++;在python中使用特征库函数 我在C++的帮助下做了一些计算,函数是这样的: MatrixXd Cov(MatrixXd Data) { VectorXd meanVector; ... return Covariance; }

呼叫C++;在python中使用特征库函数 我在C++的帮助下做了一些计算,函数是这样的: MatrixXd Cov(MatrixXd Data) { VectorXd meanVector; ... return Covariance; },python,c++,matrix,eigen,python-c-api,Python,C++,Matrix,Eigen,Python C Api,..在wrap python函数中: static PyObject *Wrap_Cov(PyObject *self,PyObject *args) { Pyobject *Objectdata; if(!PyArg_ParseTuple(args,"O", &ObjectData)) return NULL; Cov(ObjectData); return Py_BuildValue("O",&cov

..在wrap python函数中:

static PyObject *Wrap_Cov(PyObject *self,PyObject *args)
{   
      Pyobject *Objectdata;

      if(!PyArg_ParseTuple(args,"O", &ObjectData))
        return NULL;

      Cov(ObjectData);

      return Py_BuildValue("O",&covariance_answer);

  }
显然,Python不知道我定义的“对象”,它不能将“MatrixXd”转换为“对象”,我认为它是某种“数组”,而不是“对象”


在不使用boost的情况下,如何做到这一点?

如果使用不同语言编写的数字模块进行接口,最好尽量保持数据交换的平坦性

Libegen实矩阵的最平坦表示是实数类型的c数组(浮点或双精度)

这是一个C++样本



python2.7 setup_eigen_python.py install --user
这里有一个小测试驱动程序




特别是,但迄今为止还没有限制,因为必须在不增加的情况下相处,所以最好使用C++ 2011标准的特性,如“代码>自动<代码>和<代码> STD::UNQuijyPTR < /代码>,但我不知道QO是否对此有足够的支持。P>可以使用C++生成包装器,这样Python就知道了你的类的接口。不幸的是,我不知道这个过程的细节,因为我自己没有做过(只使用了一个已经完成的库),这就是为什么这是一个注释而不是答案。你能确认你想为Python创建一个C++扩展吗?换句话说,你想让你的C++ COVE()函数对你的Python脚本可用吗?如果是这样,您基本上想使用pyGAR**函数从Python函数参数中提取数据到C++变量(而不是上面的PyObjor),然后使用pyBuff*函数将结果传递回Python。如果您提供的python代码显示了一个示例用例,那么我们可以发布一个答案。但是SWIG是一个工具,我经常使用它来生成C++代码,它可以为PyARG和PyBug等所有调用,使用异常传播等等。所有使用SWIG所必须做的就是安装在您的计算机上,创建一个.i文件,其中包括Matrxd类的.h和COV函数,运行它,构建SWIG生成的库,然后启动Python:您可以从Python中调用Cov,因为您根本没有C API可供使用@哇,谢谢!这是一个很好的建议。在我的个人项目中,我会尽量记住这一点。你想要Cython或SWIG解决方案,还是希望这个包装用纯C编写?

from distutils.core import setup, Extension

cpp_args = ['-Wall', '-pedantic']
cxx_args = ['-std=c++11'].extend(cpp_args)

module_eigen_python = Extension('eigen_python',
                          define_macros = [('MAJOR_VERSION', '0'),
                                            ('MINOR_VERSION', '1')],
                          include_dirs = ['/usr/local/include'],
                          sources = ['eigen_python.cpp'],
                          extra_compile_args = cpp_args
#                          sources = ['eigen_python.cxx'],
#                          extra_compile_args = cxx_args
                      )

setup (name = 'eigen_python',
       version = '0.1',
       description = 'This is just a demo',
       author = 'Solkar',
       url = 'http://stackoverflow.com/questions' 
         + '/15573557/call-c-using-eigen-library-function-in-python',
       long_description = 'just a toy',
       ext_modules = [module_eigen_python])
python2.7 setup_eigen_python.py install --user
import eigen_python as ep
import numpy as np

DIM = 4

M = np.array(ep.randomDxDMatrix(DIM), order="F")
M.shape= DIM,DIM

print(M)