#include <stdio.h>
#define MINDATA(a,b) (a<b?a:b)
double calcAverage(double *x, int len)
{
int i;
double sum = 0;
for(i=0;i<len;i++)
{
sum += x[i];
}
return sum / len;
}
void calc_Y_with_a_b(double *x, double *y, double b, double a, int len)
{
int i;
for(i=0;i<len;i++)
{
y[i] = x[i] * b + a;
}
}
double calcVarianceSum(double *x, double xAverage, int len)
{
int i;
double sum = 0;
for(i=0;i<len;i++)
{
sum += (x[i] - xAverage) * (x[i] - xAverage);
}
return sum;
}
double calcConvarianceSum(double *x, double *y, double xAverage, double yAverage, int len)
{
int i;
double sum = 0;
for(i=0;i<len;i++)
{
sum += (x[i] - xAverage) * (y[i] - yAverage);
}
return sum;
}
double calcConvarianceSample(double *x, double *y, int len)
{
int i;
double sum = 0;
for(i=0;i<len;i++)
{
sum += (x[i] - y[i]) * (x[i] - y[i]);
}
return sum / len;
}
double debugPrintfArray(double *x, int len, const char *file, int line)
{
int i;
printf("the array is in:%s,%d", file, line);
for(i=0;i<len;i++)
{
if(i % 4 == 0)
printf("\\\n");
printf("%15.4lf ,", x[i]);
}
printf("\n");
printf("\n");
}
int main()
{
double outY[] =
{0.48 ,0.99 ,1.49 ,1.99 ,\
2.51 ,3.00 ,3.52 ,3.99 ,\
4.50 ,5.01 ,5.49 ,6.00 ,\
6.51 ,7.01 ,7.49 ,8.00 ,\
8.51 ,9.02 ,9.51 ,10.02 ,\
10.51 ,11.01 ,11.49 ,12.00 ,\
12.49 ,13.00 ,13.52 ,14.07 ,\
14.52 ,14.99 ,};
/* double sample[] = { 0.2680 , 0.8752 , 1.3828 , 1.8706 ,\
2.4578 , 3.0650 , 3.6424 , 4.1799 ,\
4.6875 , 5.1753 , 5.6531 , 6.1010 ,\
6.5489 , 7.0068 , 7.4945 , 7.9723 ,\
8.4601 , 8.9478 , 9.4356 , 9.9432 ,\
10.4708 , 10.9884 , 11.4960 , 11.9937 ,\
12.4914 , 12.9991 , 13.5067 , 14.0044 ,\
14.5121 , 15.0098 ,
};*/
double sample[] =
{0.40 ,1.01 ,1.52 ,2.01 ,\
2.60 ,3.21 ,3.79 ,4.33 ,\
4.84 ,5.33 ,5.81 ,6.26 ,\
6.71 ,7.17 ,7.66 ,8.14 ,\
8.63 ,9.12 ,9.61 ,10.12 ,\
10.65 ,11.17 ,11.68 ,12.18 ,\
12.68 ,13.19 ,13.70 ,14.20 ,\
14.71 ,15.21 ,};
//y = bx+a
double b,a;
int sampleLen = MINDATA(sizeof(sample) / sizeof(double), sizeof(outY) / sizeof(double));
printf("sample=%lu,out=%lu,uselen=%d\n", sizeof(sample) / sizeof(double), sizeof(outY) / sizeof(double), sampleLen);
double xAver = calcAverage(sample, sampleLen);
double yAver = calcAverage(outY, sampleLen);
b = calcConvarianceSum(sample, outY, xAver, yAver, sampleLen) / calcVarianceSum(sample, xAver, sampleLen);
a = yAver - xAver * b;
printf("b=%lf,a=%lf\n", b, a);
double varianceOrigin = calcConvarianceSample(outY, sample, sampleLen);
double *ynew = new double[sampleLen];
calc_Y_with_a_b(sample, ynew, b, a, sampleLen);
double varianceNew = calcConvarianceSample(outY, ynew, sampleLen);
printf("v1=%lf,v2=%lf\n", varianceOrigin, varianceNew);
debugPrintfArray(ynew, sampleLen, __FILE__, __LINE__);
delete(ynew);
return 1;
}