我只是陷入了SWIG和numpy这个微不足道的问题。 我在C中有一个专门的矩阵(n,k)向量(k)产品,我想与numpy接口。所以我总是在乘法之前知道输出向量的形状(n)。
目前,C函数分配内存并向计算的产品返回double *。防止内存泄漏并避免更改C代码 我在dot example:
中进行界面操作%apply (int DIM1, int DIM2, double* IN_ARRAY2) {(int m1, int nd1, double* xd)};
%apply (int DIM1, double* IN_ARRAY1) {(int nd2, double* zd)};
%apply (int DIM1, double* ARGOUT_ARRAY1) {(int nd4, double* za)};
%rename (mat_vec_mul) my_mat_vec_mul;
%ignore mat_vec_mul;
%include "math_lib.h"
%exception my_mat_vec_mul {
$action
if (PyErr_Occurred()) SWIG_fail;
}
%inline %{
void my_mat_vec_mul( int m1, int nd1, double* xd, int nd2, double* zd, int nd4, double* za)
{
if (nd1 != nd2) {
PyErr_Format(PyExc_ValueError,
"Arrays of lengths (%d,%d) given",
nd1, nd2);
}
int i;
double *tmp = NULL;
tmp = mat_vec_mul(m1,nd1,xd,zd);
for( i = 0; i < nd1; i++){
za[i] = tmp[i];
}
free(tmp);
}
%}
现在,因为我将输出向量指定为ARGOUT_ARRAY1,所以在python中调用该函数
v = test.mat_vec_mul(A,b,A.shape[0])
这很不方便。有没有办法在内部告诉swig的大小?或者是提供用户友好界面以在其周围添加额外包装的唯一方法:
def user_interface_mat_vec_mul(A,b):
mat_vec_mul(A,b,A.shape[0])
提前致谢。
答案 0 :(得分:1)
这是我的答案,我找到了一种方法将包装函数放入swig文件中,这基本上完全符合我的要求:
%pythoncode %{
def mat_vec_mul(A, b):
return _test._mat_vec_mul(A, b, A.shape[0])
%}