【发布时间】:2015-05-04 05:17:45
【问题描述】:
我刚从 Matlab 转入 Python,我知道调用 C 函数与 Matlab mex 不同。由于缺乏适当的文档,我已经在网上肆虐了好几天,但找不到解决我的简单问题的方法。
基本上我想在 Python 中调用一个 C-Function,输入 2 个整数和一个二维数组,进行一些计算,然后返回一个二维数组。我还想输出一些其他变量(这可能需要使用结构)。我知道这是非常基本的东西,但如果有人可以帮助我,我将不胜感激。
所以我希望在 matlab 中与此等价!谢谢!!!
[Nxy,outArray] = 函数(Nx,Ny,inArray)
setup.py 的代码
from distutils.core import setup, Extension
import numpy.distutils.misc_util
setup(
ext_modules=[Extension("myfunc", ["myfunc.c"])],
include_dirs=numpy.distutils.misc_util.get_numpy_include_dirs(),
)
myfunc.c 的代码
static char module_docstring[] =
"This function does some calculations...";
static char Run_docstring[] =
"Run what ever algorithm there is!";
static PyObject *Run(PyObject *self, PyObject *args)
{
int i, j, Nx, Ny;
PyObject *Data;
/* Parse the input tuple */
if (!PyArg_ParseTuple(args, "iiO", &Nx, &Ny, &Data)) // Data is a 2D array
return NULL;
PyObject *array = PyArray_FROM_OTF(Data, NPY_DOUBLE, NPY_IN_ARRAY); // Interpret as numpy array
double *newData = (double*)PyArray_DATA(array); // Pointers to the data as C-types
double outData[Ny][Nx]; // Creating output 2D Array
int outCount;
// Calculations
outCount = Nx*Ny;
for (i=0; i<Nx; i++){
for (j=0; i<Ny; j++){
outData[j][i] = sqrt(Data[j][i]) + sqrt(outCount);
}
}
// Free memory used in PyObject
Py_DECREF(array);
// Return output Data
PyObject *ret = Py_BuildValue("i", outCount);
return ret, PyArray_Return(outData);
}
static PyMethodDef module_methods[] = {
{"Run", Run, METH_VARARGS, Run_docstring},
{NULL, NULL, 0, NULL}
};
PyMODINIT_FUNC initmyfunc(void)
{
PyObject *m = Py_InitModule3("myfunc", module_methods, module_docstring);
if (m == NULL)
return;
import_array();
}
【问题讨论】:
-
这段代码给你什么行为?你希望它表现如何?
-
如果您打算使用 Numpy 作为 matlab 替代品,请查看带有 numpy 的 swig。它使 python 与 C 函数(例如,甚至使用 openmp)的接口变得容易,以便快速计算。
-
这个代码不起作用,因为你不能返回两个变量。
标签: python c arrays function return