我正在尝试将 python 脚本中的一些函数移动到 c 以提高计算速度。我已经成功地为具有多个一维数组作为输入并使用 numpy.i 类型映射返回双精度的函数完成了此操作。
但是,我想移至 c 的另一个函数将 3 维 numpy 数组作为输入,并返回一个 1 维双精度数组。我已经尝试过与之前的函数相同的方法,但到目前为止,这只在调用函数时导致了分段错误。
这就是我所做的:
c中的函数定义为(3d数组是“WF”,要返回的数组是“charges”,而“pos_x”、“pos_y”和“pos_z”是一些1D输入数组):
void GetCharges(double* pos_x, double* pos_y, double* pos_z, double* charges, double*** WF, double resolution, double shape, int number){
...
}
“WF”的条目在代码中的地址为WF[i][j][k]
。
SWIG 接口文件如下所示:
/* file: GetCharges.i */
%module GetCharges
%{
#define SWIG_FILE_WITH_INIT
#include "GetCharges.h"
%}
%include "numpy.i"
%init %{
import_array();
%}
%apply (double* IN_ARRAY1, int DIM1) {(double* pos_x, int number1),(double* pos_y, int number2),(double* pos_z, int number3)}
%apply (double* IN_ARRAY3, int DIM1, int DIM2, int DIM3) {(double*** WF, int dim1, int dim2, int dim3)}
%apply (double* INPLACE_ARRAY1, int DIM1) {(double* charges, int number4)}
%rename (GetCharges) GetCharges_temp;
%ignore GetCharges;
%inline %{
void GetCharges_temp(double* pos_x, int number1, double* pos_y, int number2, double* pos_z, int number3, double *charges, int number4, double*** WF, int dim1, int dim2, int dim3, double resolution, double shape)
{
GetCharges(pos_x, pos_y, pos_z, charges, WF, resolution, shape, number1);
}
%}
%include "GetCharges.h"
如您所见,我尝试将 INPLACE_ARRAY 用于返回值的数组。
我不习惯 c,所以也许错误是非常简单和愚蠢的。
任何帮助将非常感激。