計算速度を上げるために、Python スクリプトのいくつかの関数を c に移動しようとしています。入力として複数の 1 次元配列を持ち、numpy.i タイプマップを使用して double を返す関数に対して、これを成功させました。
ただし、c に移動したい別の関数は、入力として 3 次元の numpy 配列を取り、double の 1 次元配列を返します。以前の関数と同じアプローチを試みましたが、これまでのところ、関数が呼び出されたときにのみセグメンテーション違反が発生しました。
これは私がしたことです:
c の関数は次のように定義されます (3 次元配列は「WF」、返される配列は「料金」、「pos_x」、「pos_y、および pos_z」は 1 次元入力配列です):
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に慣れていないので、エラーは非常に単純でばかげているかもしれません。
どんな助けでも大歓迎です。