我有两个 64 位整数数组(一个用于 x 值,一个用于 y 值),我想拟合一条从原点开始的直线。它们都有长度 num
。
我之前对两个数组进行了解析,以便它们都从零开始,因此我必须根据 result
的值移动两个数组之一,通过 pos1
或 pos2
。
现在,正如我所说,数组是 64 位整数大小,因此我将它们转换为 double。但每当我调用下面的代码时,程序就会崩溃。 c1
、cov11
和 sumsq
在外部定义为指向 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/