返回一个已知大小的向量而不需要额外的包装器?

Posted

技术标签:

【中文标题】返回一个已知大小的向量而不需要额外的包装器?【英文标题】:Return a vector of known size without additional wrapper? 【发布时间】:2013-09-22 09:05:40 【问题描述】:

我只是被 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])

提前致谢。

【问题讨论】:

【参考方案1】:

这是我的答案,我找到了一种将包装函数放入 swig 文件的方法,它基本上可以满足我的要求:

%pythoncode %
def mat_vec_mul(A, b):
    return _test._mat_vec_mul(A, b, A.shape[0])
%

【讨论】:

以上是关于返回一个已知大小的向量而不需要额外的包装器?的主要内容,如果未能解决你的问题,请参考以下文章

矢量调整大小 - 检测的便携方式

扩展作为内存传递的向量的大小

Spark - 为 udf 提供额外的参数

根据额外参数对向量进行排序

使用额外参数创建通用视图装饰器

这段代码有啥错误,在二维向量中如何添加额外的元素?