2010-05-02 5 views
1

J'essaie de transmettre des données autour des couches numpy et boost :: ublas. J'ai écrit un wrapper ultra mince parce que swig ne peut pas analyser correctement l'en-tête d'ublas. Le code est illustré ci-dessouswrapping boost :: ublas avec swig

#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(){} 
}; 

avec l'interface SWIG qui ressemble à

%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(); 
}; 

je les ai compilé avec succès via gcc 4.3 et vC++ 9.0. Cependant quand je lance simplement

a = dvector(array([1.,2.,3.])) 

il me donne une erreur de segmentation. C'est la première fois que j'utilise swigh avec numpy et ne pas avoir entièrement compris entre la conversion de données et passage de la mémoire tampon. Est-ce que quelqu'un voit quelque chose d'évident que j'ai manqué? J'ai essayé de tracer avec un débogueur mais il s'est écrasé dans les assmeblys de python.exe. Je n'ai aucune idée si c'est un problème de swig ou de mon emballage simple. Tout est apprécié.

Répondre

1

Vous pouvez remplacer

copie (ptr, ptr + sizeof (double) * taille, & (dv :: données() [0]));

par

copie papier (ptr, ptr + taille, & (dv :: données() [0])); Rappelez-vous qu'en C/C++, l'addition ou la soustraction d'un pointeur le déplace d'un multiple de la taille du type de données vers lequel il pointe.

Best,

3

Vous pourriez être intéressé à regarder le module pyublas. Il effectue la conversion entre les tableaux de nombres et les types de données ublas de façon transparente et sans copie.