2014-10-22 33 views
0

我需要將gsl_vector傳遞給需要C風格數組的函數,反之亦然。GSL - GNU Scientific Library:避免深度複製

慢的方法(這涉及到一個深拷貝)應該是:

const size_t n = 4; 
gsl_vector gx; // initialize and fill 
gsl_vector gy; // initialize 
double in[n], out[n]; 

for(size_t i = 0; i < n; ++i) 
    in[i] = gsl_vector_get(gx, i); 

func(in, out, n); 

for(size_t i = 0; i < n; ++i) 
    gsl_vector_set(gy, i, out[i]); 


我可以這樣做:

const size_t n = 4; 
gsl_vector gx; // initialize and fill 
gsl_vector gy; // initialize 

func(gx.data, gy.data, n); 
+0

是的,但唯一的權威是我自己做的。 – Evert 2014-10-22 11:39:59

+0

但是,我不明白爲什麼有一個函數具有'in'和'out'數組,但顯然你將兩個參數傳給它的是相同的數組。這看起來不正確(即,函數改變了輸入數組,所以應該只有一個'inout'數組)。 – Evert 2014-10-22 11:41:07

+0

你可能應該使用'gv.size'而不是'n'。 – Evert 2014-10-22 11:42:19

回答

2

你可以用C數組開始,然後通過gsl_vector_view_array(文檔here)轉換爲gsl_vector不深的份!然後,您可以在gsl中運行所需的計算,然後,可以將相同的數組傳遞給任何C函數。

// something like 
int size = 10 
double* xarray = new double[size] // you can use malloc here. Irrelevant to the answer 
gsl_vector_view xarray_gsl = gsl_vector_view_array (xarray, size); 
// Now xarray_gsl.vector is a gsl_vector that you can send to any gsl routine 
// After that you can send the original xarray to any C function 
// No deep copies are involved