用swig包裹boost :: ublas

时间:2010-05-02 22:59:12

标签: c++ python boost swig

我试图围绕numpy和boost :: ublas层传递数据。一世 写了一个超薄的包装因为swig无法解析ublas' 标题正确。代码如下所示

#include <boost/numeric/ublas/vector.hpp>
#include <boost/numeric/ublas/matrix.hpp>
#include <boost/lexical_cast.hpp>
#include <algorithm>
#include <sstream>
#include <string>

using std::copy;
using namespace boost;

typedef boost::numeric::ublas::matrix<double> dm;
typedef boost::numeric::ublas::vector<double> dv;

class dvector : public dv{
 public:
 dvector(const int rhs):dv(rhs){;};
 dvector();
 dvector(const int size, double* ptr):dv(size){
   copy(ptr, ptr+sizeof(double)*size, &(dv::data()[0]));
 }
 ~dvector(){}
};

SWIG界面看起来像

%apply(int DIM1, double* INPLACE_ARRAY1) {(const int size, double* ptr)}
class dvector{
 public:
 dvector(const int rhs);
 dvector();
 dvector(const int size, double* ptr);
       %newobject toString;
 char* toString();
       ~dvector();
};

我已经通过gcc 4.3和vc ++ 9.0成功编译了它们。然而 当我只是运行

a = dvector(array([1.,2.,3.]))
它给了我一个段错误。这是我第一次使用numpy swigh 并没有完全理解数据转换和 内存缓冲区传递。有没有人看到我有的明显的东西 错过了什么?我试图用调试器跟踪,但它在python.exe的assmebless中崩溃。我不知道这是一个swig问题还是我的简单包装器。任何事情都表示赞赏。

2 个答案:

答案 0 :(得分:3)

您可能有兴趣查看pyublas模块。它无缝地进行numpy数组和ublas数据类型之间的转换,无需复制。

答案 1 :(得分:1)

您可能想要替换

copy(ptr,ptr + sizeof(double)* size,&amp;(dv :: data()[0]));

通过

copy(ptr,ptr + size,&amp;(dv :: data()[0]));

请记住,在C / C ++中,从指针中添加或减去指针会使其移动它指向的数据类型大小的倍数。

最佳,