我在numpy.i文档中找到了以下SWIG规则。
( DATA_TYPE ARGOUT_ARRAY2[ANY][ANY] )
坦率地说,这个片段不知道如何包装返回3 * 3矩阵的C ++函数。 “任何”是什么意思?假设,我有一个带有签名void make_matrix(double** matrix)
的函数。它使用malloc()分配3*3*sizeof(double)
个字节,并将它们写入out参数。现在应用这个规则?如何将3绑定到“任何”?如何将矩阵绑定到“ARGOUT_ARRAY2”?如何绑定DATA_TYPE加倍?是否有任何文件涵盖这些细节?
答案 0 :(得分:0)
根据您引用的文档(在Input Arrays部分中):
列出的第一个签名
( DATA_TYPE IN_ARRAY[ANY] )
用于具有硬编码维度的一维数组。同样,( DATA_TYPE IN_ARRAY2[ANY][ANY] )
用于具有硬编码维度的二维数组,对于三维也是如此。
全部大写部分是您实际使用的值的占位符。正确使用取决于对SWIG语法的透彻理解。
答案 1 :(得分:0)
如果您碰巧使用古老的Eigen库来表示C ++中的矩阵,那么wrappers中有一些非常有用的SWIG Biomechanical Toolkit允许Eigen
将矩阵透明地转换为numpy
数组。
您的SWIG界面定义应包含以下内容:
%module(docstring="Simple SWIG+Eigen demo") myeigenswig
%include eigen.i
%include numpy.i
%{
#define SWIG_FILE_WITH_INIT
#include <Eigen/Core>
#include "mylibrary.hpp"
%}
%init %{
import_array();
%}
%eigen_typemaps(Eigen::VectorXd)
%eigen_typemaps(Eigen::MatrixXd)
Eigen::MatrixXd myFunction();
另一个选择,如果你不使用Eigen,就是将你的3x3 C ++数组转换为9个元素std::vector<double>
,SWIG可以很容易地转换成Python列表,然后可以转换为通过调用numpy.asarray(vectorFromCxx).reshape((3,3))
来获取numpy数组。这将不是特别有效,涉及在不同数据结构之间进行相当多的复制,但对于您的应用程序可能已经足够了,除非您在C ++和C ++之间传递了许多矩阵。蟒。