【问题标题】:wrapping boost::ublas with swig用 swig 包装 boost::ublas
【发布时间】:2023-03-08 01:46:01
【问题描述】:

我正在尝试在 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.]))

它给了我一个段错误。这是我第一次将 sigh 与 numpy 一起使用 并没有完全了解数据转换和 内存缓冲区传递。有没有人看到我有明显的东西 错过了吗?我曾尝试使用调试器进行跟踪,但它在 python.exe 的程序集中崩溃了。我不知道这是痛饮问题还是我的简单包装问题。任何事情都值得赞赏。

【问题讨论】:

    标签: c++ python boost swig


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你可能想替换

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

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

      请记住,在 C/C++ 中,对指针进行加法或减法会将其移动它所指向的数据类型大小的倍数。

      最好的,

      【讨论】:

        猜你喜欢
        • 2011-03-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-03-21
        相关资源
        最近更新 更多