2011-01-11 64 views
2

我探索封裝C++類與SWIG和在數據傳遞從numpy的通過2D陣列從numpy的到C++通過痛飲不能使用浮法**

我可以成功地傳遞一個一維數組使用以下類型映射

(float*, IN_ARRAY1, int DIM1) 

數組的大小沒有在編譯時已知的,因此我不能使用的類型映射

(float, IN_ARRAY2[DIM1][DIM2]) 

的numpy.i幫助建議使用

(float*, IN_ARRAY2, int DIM1, int DIM2) 

但是我的C++類希望 - 一個指向花車

void Initialise(float** buffer, long dim1, long dim2) 

的指針使用浮動* IN_ARRAY2類型的地圖,我需要我的交錯兩個維度? urg我希望不會,有人成功地做到了這一點,你做了什麼。

回答

0

無論如何,如果您傳遞一個數組作爲參數,您將指針傳遞給數組的第一個元素。你必須知道數組維度才能使用它。

2

你看起來不能將float **傳遞給numpy的C API,因爲它們先驗地不兼容內存表示。

在numpy的,在陣列中的數據必須是在一個單一的連續的存儲區域(可以有孔,但它們必須英尺一個塊作爲通過例如malloc的分配):

data -> | - | - | - | ..... | - | # this is allocated in one block 
     a0 a1 a2   an 

當使用浮**,很可能你的內存型號爲:

float** a; 
int n = 10, m = 20; // n,m matrix 

a = malloc(sizeof(*a) * n) // ten rows 
for (int i=0; i < n; ++i) { 
    a[i] = malloc(sizeof(*a[i]) * m); // one row of 29 items 
} 

也就是說,內存明智:

a -> | a[0] | -> | a[0][0] | a[0][1] | a[0][2] | 
    | a[1] | -> | a[1][0] | .... 

這實際上對於數值計算來說幾乎總是一個不好的格式,因爲你不能在一個塊中傳遞數據(對內存局部性等不利),並且幾乎所有值得使用它的鹽數字庫都使用該格式。見例如this獲得解釋。

不過,假設你不能修改你的代碼,你可以輕鬆地將單塊格式漂浮**格式不復制(對面是不可能的):

void convert(float *in, int n, int m, float ***out) 
{ 
    float **data; 
    int i; 

    data = malloc(sizeof(*data) * n); 
    for(i = 0; i < n; ++i) { 
      data[i] = in + i * m: 
    }  

    *out = data; 
} 

你調用這個函數這樣

float **a; 
convert((float*)numpy_data, n, m, &a); 

Initialise(a, n, m); 

實際上最好不要從API POV中分配函數,這只是給你一個想法,在兩種格式之間進行轉換。

+0

你不需要調用malloc來做一個`float **`。只需初始化`float *`數組即可指向2-D數組中的每一行。 – 2011-01-14 02:31:36