gpt4 book ai didi

python - 使用 Swig 用 Python 包装 Eigen/C++ 时出错

转载 作者:行者123 更新时间:2023-11-30 02:45:31 25 4
gpt4 key购买 nike

我在使用 SWIG 包装一个使用 Eigen(线性代数包)的小项目时遇到了问题。我遇到了一个我不理解的 python 错误,也无法在网上找到很多相关信息 - 但我怀疑某处存在一些 C++ 内存损坏。我把它归结为一个玩具示例..但不幸的是它仍然很长:

--- 测试函数.cxx ----

#include "Eigen/Dense" 

Eigen::VectorXd test(Eigen::MatrixXd data){
Eigen::VectorXd temp;
return temp;
}

--- testswig.i -----

%module testswig 

%{
#define SWIG_FILE_WITH_INIT
#include "Eigen/Core"
#include <Python.h>
#include <numpy/arrayobject.h>
#include "testfunc.cxx"

%}

%init
%{
import_array();
%}

%include "numpy.i"

%typemap(out) Eigen::VectorXd
{
npy_intp dims[1] = {$1.size()};
PyObject* array = PyArray_SimpleNew(1, dims, NPY_DOUBLE);
double* data = ((double *)PyArray_DATA( array ));
for (int i = 0; i != dims[0]; ++i){
*data++ = $1.data()[i];
}
$result = array;
}

%typemap(in) Eigen::MatrixXd (Eigen::MatrixXd TEMP)
{

int rows = 0;
int cols = 0;

rows = PyArray_DIM($input,0);
cols = PyArray_DIM($input,1);

PyArrayObject* temp;
PyArg_ParseTuple($input, "O", &temp);

TEMP.resize(rows,cols);
TEMP.fill(0);

double * values = ((double *) PyArray_DATA($input));
for (long int i = 0; i != rows; ++i){
for(long int j = 0; j != cols; ++j){
// std::cout << "data " << data[i] << std::endl;
TEMP(i,j) = values[i*rows+j];
}
}

}

%include "testfunc.cxx"

--- 设置.py ----

from distutils.core import setup, Extension 
import numpy
numpyinclude = numpy.__file__[:-12] + 'core/include/'
testswig = Extension('_testswig',
sources=['testswig_wrap.cxx'],
include_dirs=['../', numpyinclude])

setup (name = 'testswig',
version = '0.1',
author = "NoName",
description = """ """,
ext_modules = [testswig],
py_modules = ["testswig"])

----- 建筑 ------

我正在一个包含所有 3 个文件的文件夹和一个包含 Eigen header 的文件夹“Eigen”中构建它。命令是:

swig -c++ -python -I./ testswig.i 
python setup.py install

--------错误------------

然后我运行一个包含

的python文件
import testswig 
import numpy as np
print testswig.test(np.array([[2,3],[4,5]]))

这会给出错误“SystemError:新样式 getargs 格式但参数不是元组”。

注意几点:1) 相同的命令直接从 python 解释器运行良好。2) 如果函数不返回 Eigen::VectorXd,或不采用 Eigen:MatrixXd,则它工作正常。

感谢您的宝贵时间。

最佳答案

在你的类型图中你有:

PyArrayObject *temp;
PyArg_ParseTuple($input, "O", &temp);

这是不正确的 - $input 是一个 PyObject,它已经在这个阶段从参数中提取出来,但不是一个元组,所以你想要:

PyArrayObject *temp=NULL;
if (PyArray_Check($input))
temp = (PyArrayObject*)$input;

验证它的类型是否正确,如果是则进行转换。

关于python - 使用 Swig 用 Python 包装 Eigen/C++ 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24375198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com