我正在尝试将这行Matlab代码转换为c编程语言:
coefs = polyfit(X(50:(length(X)-50)),Y(50:(length(Y)-50)),1);
我尝试过不同的实现,但是没有一个能给予相同的coefs(1)
值,也就是斜率,我感兴趣的只是斜率。
- 注意:所有的代码可能过于复杂。截至目前,我不知道任何更好的。仍然是新的。*
因为c没有动态数组,所以我有两个链表,X和Y
**UPDATE:**我把所有的东西都改成了*float
而不是列表。下面是函数的代码和声明。
float getSumF(float * head, int size){
int i;
float sum=0;
for (i=0;i<size;i++){
sum = sum + head[i];
}
return sum;
}
float coef (float* xx, float* yy, int size) {
int i=0;
float sumX2 = 0;
float sumXY = 0;
float sumX = 0;
float sumY = 0;
for (i=0;i<size;i++){
sumX = sumX + xx[i];
sumY = sumY + yy[i];
sumX2 = sumX2 + xx[i]*xx[i];
sumXY = sumXY + xx[i]*yy[i];
}
float slope = (size*sumXY-sumX*sumY)/(size*sumX2-sumX*sumX);
return slope;
}
int main(void) {
setbuf(stdout, NULL);
int threshold=20;
int k, i, j;
float slope, angle;
int width, height, channels;
float* X = 0;
float* Y = 0;
int arraysizeX = 0;
float* osc = 0;
int arraysizeOsc = 0;
float* coord = 0;
int arraysizeCoord = 0;
unsigned char *img;
我实现Matlab数组索引的方法是这样的:
for(i=0;i<1440;i++){
if (coord[i] > 0){
X = realloc (X,++arraysizeX*sizeof(*X));
Y = realloc (Y,arraysizeX*sizeof(*Y));
X[arraysizeX-1]=i+1;
Y[arraysizeX-1]=coord[i];
}
}
if (arraysizeX>102){
slope=coef(X+50,Y+50,arraysizeX-100);
}
else{
if(arraysizeX==0){
free(X);
free(Y);
free(coord);
printf("Threshold too low. Exiting.\n");
return 3;
}
slope = coef(X,Y,arraysizeX);
}
我还在matlab中编写了相同的线性回归算法,如下所示:
sizeX=length(X);
sumX2 = 0;
sumXY = 0;
for i=1:sizeX
sumX2 = sumX2 + X(i)*X(i);
sumXY = sumXY + X(i)*Y(i);
endfor
slope=(sizeX*sumXY-sum(X)*sum(Y))/(sizeX*sumX2-sum(X)*sum(X));
x一米二米一x一米三米一x一米四米一
现在..是我在coef
调用/函数中的错误吗?我做的一切都对吗?
**更新:**我提供的解决方案(在评论的指导下)运行正常。错误出现在matlab代码中,在获取X
和Y
数组时。
1条答案
按热度按时间w8biq8rn1#
正如更新后:我提供的解决方案(从评论中做了一些调整)运行正常。错误在matlab代码中,在X和Y数组的获取中。