如何将Matlab的polyfit与数组索引逻辑转换为C语言?
Matlab转C语言:线性回归斜率计算结果不一致问题
我想把这段Matlab代码转成C语言,只需要获取斜率(即coefs(1)):
coefs = polyfit(X(50:(length(X)-50)),Y(50:(length(Y)-50)),1);
但多次尝试后,C语言计算出的斜率和Matlab结果完全对不上。
我是编程新手,一开始用链表实现,后来改成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里也写了和C语言逻辑一致的线性回归代码:
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));
各方法得到的斜率结果:
slope_polyfit = 7.4615e-3 slope_matlab = 5.8421e-3 slope_c = -0.175331
我的疑问:
错误是不是出在coef函数的调用或者实现里?我的代码逻辑有没有问题?
更新:经指导后问题已解决,错误源于Matlab代码中X、Y数组的获取环节。
内容的提问来源于stack exchange,提问作者ATSlooking4things
相关产品推荐
相关产品推荐

