I myself implemented this linear interpolation (some of them are written in Spanish, sorry). A function called encuentraValorMasProximo simply finds the closest value (elementoMasProximo) and index (indiceEnVector) to another (xx [i]) in the array (xD).
void interp1(int *x, int x_tam, double *y, int *xx, int xx_tam, double *yy) { double *dx, *dy, *slope, *intercept, *elementoMasProximo, *xD; int i, *indiceEnVector; dx=(double *)calloc(x_tam-1,sizeof(double)); dy=(double *)calloc(x_tam-1,sizeof(double)); slope=(double *)calloc(x_tam-1,sizeof(double)); intercept=(double *)calloc(x_tam-1,sizeof(double)); indiceEnVector=(int *) malloc(sizeof(int)); elementoMasProximo=(double *) malloc(sizeof(double)); xD=(double *)calloc(x_tam,sizeof(double)); for(i=0;i<x_tam;i++){ xD[i]=x[i]; } for(i = 0; i < x_tam; i++){ if(i<x_tam-1){ dx[i] = x[i + 1] - x[i]; dy[i] = y[i + 1] - y[i]; slope[i] = dy[i] / dx[i]; intercept[i] = y[i] - x[i] * slope[i]; }else{ dx[i]=dx[i-1]; dy[i]=dy[i-1]; slope[i]=slope[i-1]; intercept[i]=intercept[i-1]; } } for (i = 0; i < xx_tam; i++) { encuentraValorMasProximo(xx[i], xD, x_tam, x_tam, elementoMasProximo, indiceEnVector); yy[i]=slope[*indiceEnVector] * xx[i] + intercept[*indiceEnVector]; } }
The test function may be:
void main(){ int x_tam, xx_tam, i; double *yy; int x[]={3,6,9}; double y[]={6,12,18}; int xx[]={1,2,3,4,5,6,7,8,9,10}; x_tam=3; xx_tam=10; yy=(double *) calloc(xx_tam,sizeof(double)); interp1(x, x_tam, y, xx, xx_tam, yy); for(i=0;i<xx_tam;i++){ printf("%d\t%f\n",xx[i],yy[i]); } }
And its result :
1 2.000000
2 4.000000
3 6.000000
4 8.000000
5 10.000000
6 12.000000
7 14.000000
8 16.000000
9 18.000000
10 20.000000