2014-10-22 55 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