c - 使用 C 语言的 GNU 科学库进行线性拟合

标签 c linear-regression gsl data-fitting

我有两个 64 位整数数组(一个用于 x 值,一个用于 y 值),我想拟合一条从原点开始的直线。它们都有长度 num

我之前对两个数组进行了解析,以便它们都从零开始,因此我必须根据 result 的值移动两个数组之一,通过 pos1pos2

现在,正如我所说,数组是 64 位整数大小,因此我将它们转换为 double。但每当我调用下面的代码时,程序就会崩溃。 c1cov11sumsq 在外部定义为指向 double 的指针。

if(result > 0)  
gsl_fit_mul((double *) array1 + pos2, 1,(double *) array2, 1, (num - pos2 - 1) * sizeof(uint64_t), c1, cov11, sumsq);
else
gsl_fit_mul((double *) array1, 1, (double *) array2 + pos1, 1, (num - pos2 - 1) * sizeof(uint64_t), c1, cov11, sumsq);

我尝试阅读the documentation ,但实际上不是那么清楚,我认为问题出在对数组的调用上。

提前谢谢您。

<小时/>

编辑:我改变了方法。我写了这个函数

void findFit(uint64_t *array1, uint64_t *array2, uint64_t num, double c1){
    double *array1_parallel = malloc(num * sizeof(double)), *array2_parallel = malloc(num * sizeof(double));

    for(uint64_t i = 0; i < num; i++){
        array1_parallel[i] = (double) array1[i];
        array2_parallel[i] = (double) array2[i];
    }

    double *cov11, *sumsq;

    gsl_fit_mul(array1_parallel, 1, array2_parallel, 1, num, &c1, cov11, sumsq);

    free(array2_parallel);
    free(array1_parallel);

    return;
}

将已经移位和解析的数组传递给它,但它仍然不起作用......

最佳答案

C 中的转换可能会令人困惑。您不是在转换各个值,而是将指针转换为这些值。这不是您想要的。

所以,你告诉 gsl_fit_mul() - “这是一个 double 组,而不是编译器认为的整数数组。”但它们实际上是整数,所以这是行不通的。

您需要创建第二个 double 组并转换每个整数以将整数转换为 double 。

所以:

double* double_array1, *double_array2;
size_t i;

double_array1 = malloc(sizeof(double)*num);
double_array2 = malloc(sizeof(double)*num);
for (i=0; i < num; ++i) {
    double_array1[i] = array1[i];
    double_array2[i] = array2[i];
}


...
gsl_fit_mul(double_array1 + ..., double_array2, ...)
...
free(double_array1);
free(double_array2);

(完成后请务必对这些数组调用 free()。如果您在编译时知道 num 的最大值,则可以静态声明这些数组,并且不需要 malloc/free 它们) .

另外,我根本不知道这个库,但我怀疑“n”参数应该是输入数组的字节大小(这是乘以 sizeof(uint64_t) 时得到的结果) )。只需传入元素数量(num - 减去你的抵消魔法)。

关于c - 使用 C 语言的 GNU 科学库进行线性拟合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36499841/

相关文章:

c - ARM C中main中声明的全局变量和变量的区别

python - 处理回归子样本中的空值

c++ - 如何管理一系列的gsl_vector

c - 从 GSL 库中获取 C gsl_fit_linear() 函数中线性回归的 p 值

c++ - linux-aio 可以进行类似 sendfile() 的操作吗?

C启动代码只写汇编困惑

c - atoi() 给出输出为 0 尽管字符串有整数

python - 如果您的数据具有单个特征,则使用 array.reshape(-1, 1) reshape 您的数据,如果它包含单个样本,则使用 array.reshape(1, -1)

python - Numpy 和 TensorFlow 之间的差异

c - 免费 GSL 矩阵的正确方法是什么?