2010-05-02 63 views
1

我想在numpy和boost :: ublas圖層之間傳遞數據。 I 已經寫了一個超薄包裝,因爲swig無法正確解析ublas' 頭。代碼如下所示用swig包裝boost :: 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.])) 

它給了我一個段錯誤。這是我第一次使用swig和numpy ,並且沒有完全理解數據轉換和 之間的內存緩衝區通過。有沒有人看到我有 錯過了?我試圖用調試器追蹤,但它在python.exe的assmeblys內崩潰。我不知道如果這是一個流氓問題或我簡單的包裝。任何感謝。

回答

1

可能要替換

拷貝(PTR,PTR +的sizeof(雙)*大小,&(DV ::數據()[0]));

通過

拷貝(PTR,PTR +大小,&(DV ::數據()[0]));

請記住,在C/C++中,對指針進行加或減操作會將其移動一個指向它的數據類型大小的倍數。

最佳,

3

你可能有興趣在看pyublas模塊。它可以無縫地在numpy數組和ublas數據類型之間進行轉換,而無需複製。