обертывание 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)


arrow_upward
1
arrow_downward

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

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

by

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

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

Лучший,

person log0    schedule 03.05.2010

arrow_upward
3
arrow_downward

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

person D R    schedule 04.08.2010