首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用swig包装boost::ublas

使用swig包装boost::ublas
EN

Stack Overflow用户
提问于 2010-05-03 06:59:12
回答 2查看 976关注 0票数 1

我尝试在numpy和boost::ublas层中传递数据。我写了一个超薄的包装器,因为swig不能正确解析ublas的头部。代码如下所示

代码语言:javascript
复制
#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界面看起来像这样

代码语言:javascript
复制
%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成功地编译了它们。但是,当我简单地运行

代码语言:javascript
复制
a = dvector(array([1.,2.,3.]))

它给了我一个段错误。这是我第一次使用swigh和numpy,并且没有完全理解数据转换和内存缓冲区传递之间的关系。有没有人看到我明显漏掉了什么?我曾尝试使用调试器跟踪,但它在python.exe的支持下崩溃了。我不知道这是一个大口问题还是我的简单包装器问题。任何事情都是值得感谢的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-05-03 14:24:07

您可能想要替换

copy(ptr,ptr+sizeof(double)*size,&(dv::data();

通过

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

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

最好的

票数 1
EN

Stack Overflow用户

发布于 2010-08-04 08:05:23

您可能会对pyublas模块感兴趣。它可以无缝地在numpy数组和ublas数据类型之间进行转换,而且不需要复制。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2755352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档