обертывание boost::ublas с помощью 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.]))

это дает мне segfault. Это первый раз, когда я использую swigh с numpy и не совсем понимаю между преобразованием данных и передачей буфера памяти. Кто-нибудь видит что-то очевидное, что я пропустил? Я попытался проследить с помощью отладчика, но он разбился в сборках python.exe. Я понятия не имею, проблема ли это в глотке или в моей простой обертке. Все ценится.


person leon    schedule 02.05.2010    source источник


Ответы (2)


Вы можете заменить

копировать(ptr, ptr+sizeof(double)*size, &(dv::data()[0]));

by

копировать(указатель, указатель+размер, &(dv::data()[0]));

Помните, что в C/C++ добавление или вычитание из указателя перемещает его на кратное размеру типа данных, на который он указывает.

Лучший,

person log0    schedule 03.05.2010

Возможно, вас заинтересует модуль pyublas. Он выполняет преобразование между массивами numpy и типами данных ublas без проблем и без копирования.

person D R    schedule 04.08.2010