gpt4 book ai didi

c++ - 我怎样才能在cython中调用这个函数?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:45:33 24 4
gpt4 key购买 nike

在 cython 中仅使用 numpy 调用此函数的最佳方法是什么?我不会使用 ctypes、memcpy、malloc 等。

功能一)

#include <stdio.h>
extern "C" void cfun(const void * indatav, int rowcount, int colcount,
void * outdatav);

void cfun(const void * indatav, int rowcount, int colcount, void *
outdatav) {
//void cfun(const double * indata, int rowcount, int colcount,
double * outdata) {
const double * indata = (double *) indatav;
double * outdata = (double *) outdatav;
int i;
puts("Here we go!");
for (i = 0; i < rowcount * colcount; ++i) {
outdata[i] = indata[i] * 4;
}
puts("Done!");
}

功能2)

#include <stdio.h>

extern "C" __declspec(dllexport) void cfun(const double ** indata, int
rowcount, int colcount, double ** outdata) {
for (int i = 0; i < rowcount; ++i) {
for (int j = 0; j < colcount; ++j) {
outdata[i][j] = indata[i][j] * 4;
}
}
}

崔元俊

最佳答案

您可以通过将其声明为 extern 直接从 Cython“调用”该函数。

cdef extern from "mylibraryheader.h":
void cfun1(void* indatav, int rowcount, int colcount, void* outdatav)
void cfun2(double** indata, int rowcount, int colcount, doubke** outdata)

您现在可以像在 C/C++ 中一样调用这些函数。请注意,Cython 中没有 const 关键字,您可以将其省略。遗憾的是,我无法为您提供如何将 NumPy 数组转换为 double 数组的示例。但这是从 double 列表运行它的示例。

cdef extern from "mylibraryheader.h":
void cfun1(void* indatav, int rowcount, int colcount, void* outdatav)
void cfun2(double** indata, int rowcount, int colcount, double** outdata)

cdef extern from "stdlib.h":
ctypedef int size_t
void* malloc(size_t)
void free(void*)

def py_cfunc1(*values):
cdef int i = 0
cdef int size = sizeof(double)*len(values)
cdef double* indatav = <double*> malloc(size)
cdef double* outdatav = <double*> malloc(size)
cdef list outvalues = []
for v in values:
indatav[i] = <double>v
i += 1
cfun1(<void*>indatav, 1, len(values), <void*>outdatav)
for 0 <= i < len(values):
outvalues.append(outdatav[i])
return outvalues

注意:未经测试

关于c++ - 我怎样才能在cython中调用这个函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8797335/

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