C语言 如何将双指针转换为gsl向量?

gstyhher  于 2022-12-03  发布在  其他
关注(0)|答案(1)|浏览(142)

所以我创建了这个函数来将双指针转换为gsl向量:

void convert_dpvect_gslvect(int N, double *x, gsl_vector *gx)
{
     
    gx->size = N;
    for (int i = 0; i < N; i++) {
        gx->data[i] = x[i];
    }
}

这有意义吗?我想确保它正确地转换。我真的很感激你的帮助。

3htmauhk

3htmauhk1#

通过查看gsl liblink)的在线文档,我们可以找到已经完成您想要的任务的函数。作为一般规则,无论何时使用库中定义的类型,您都应该查找提供的函数来处理此类类型。
这样做的理由是,它们可能会处理在实现函数时可能忘记的错误或其他字段。
在你的例子中,看起来你有一个double向量,你想把每个元素赋给gsl_vector的元素,我这么说是因为你想:

gx->data[i] = x[i]; // Access up to N elements from x

我们需要的是提供的库函数

void gsl_vector_set(gsl_vector *v, const size_t i, double x)

This function sets the value of the i-th element of a vector v to x. If i lies outside the allowed range of 0 to size - 1 then the error handler is invoked. An inline version of this function is used when HAVE_INLINE is defined.

为了使用它,我们需要确保之前通过创建gsl_vector分配了足够的内存。我假设您有N元素,所以完整的代码应该是:

// assume x is already initialized with N elements

gsl_vector* V = gsl_vector_alloc(N);

for (int i = 0; i < N; i++) {
    gsl_vector_set( V , i, x[i] );
}

有趣的是,通过查看gsl_vector_set的源代码,它会做一些与您所想到的类似的事情,但当然还有一些对库至关重要的麻烦,比如检查范围和使用步幅来说明不同的块大小。

// from https://github.com/ampl/gsl/blob/master/vector/gsl_vector_double

INLINE_FUN
void
gsl_vector_set (gsl_vector * v, const size_t i, double x)
{
#if GSL_RANGE_CHECK
  if (GSL_RANGE_COND(i >= v->size))
    {
      GSL_ERROR_VOID ("index out of range", GSL_EINVAL);
    }
#endif
  v->data[i * v->stride] = x;
}

相关问题