diff options
| author | drowe67 <[email protected]> | 2023-07-20 08:59:48 +0930 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-07-20 08:59:48 +0930 |
| commit | 06d4c11e699b0351765f10398abb4f663a984f36 (patch) | |
| tree | 33e22af0814c5b6c3d676f096ae8c2ac8a3ed9f0 /src/linreg.c | |
| parent | 6588e77f38bdebd7adffe091b22e7760d95d0ccb (diff) | |
| parent | 4d6c143c0abec15e1d6ed1fd95d36f80e6cb7df8 (diff) | |
Merge pull request #3 from drowe67/dr-cleanup21.2.0
Cleanup Part 2
Diffstat (limited to 'src/linreg.c')
| -rw-r--r-- | src/linreg.c | 87 |
1 files changed, 41 insertions, 46 deletions
diff --git a/src/linreg.c b/src/linreg.c index f37634d..4e985df 100644 --- a/src/linreg.c +++ b/src/linreg.c @@ -34,73 +34,68 @@ along with this program; if not, see <http://www.gnu.org/licenses/>. */ +#include "linreg.h" + +#include <math.h> #include <stdio.h> #include <stdlib.h> -#include <math.h> -#include "linreg.h" #include "comp_prim.h" +void linreg(COMP *m, COMP *b, float x[], COMP y[], int n) { + float sumx = 0.0; /* sum of x */ + float sumx2 = 0.0; /* sum of x^2 */ + COMP sumxy = {0.0, 0.0}; /* sum of x * y */ + COMP sumy = {0.0, 0.0}; /* sum of y */ + COMP sumy2 = {0.0, 0.0}; /* sum of y**2 */ + float denom; + COMP zero; + int i; + + for (i = 0; i < n; i++) { + sumx += x[i]; + sumx2 += x[i] * x[i]; + sumxy = cadd(sumxy, fcmult(x[i], y[i])); + sumy = cadd(sumy, y[i]); + sumy2 = cadd(sumy2, cmult(y[i], y[i])); + } -void linreg(COMP *m, COMP *b, float x[], COMP y[], int n) -{ - float sumx = 0.0; /* sum of x */ - float sumx2 = 0.0; /* sum of x^2 */ - COMP sumxy = {0.0,0.0}; /* sum of x * y */ - COMP sumy = {0.0,0.0}; /* sum of y */ - COMP sumy2 = {0.0,0.0}; /* sum of y**2 */ - float denom; - COMP zero; - int i; - - for (i=0; i<n; i++) { - sumx += x[i]; - sumx2 += x[i]*x[i]; - sumxy = cadd(sumxy, fcmult(x[i], y[i])); - sumy = cadd(sumy, y[i]); - sumy2 = cadd(sumy2, cmult(y[i],y[i])); - } - - denom = (n * sumx2 - sumx*sumx); + denom = (n * sumx2 - sumx * sumx); if (denom == 0) { - /* singular matrix. can't solve the problem */ - zero.real = 0.0; zero.imag = 0.0; - *m = zero; - *b = zero; + /* singular matrix. can't solve the problem */ + zero.real = 0.0; + zero.imag = 0.0; + *m = zero; + *b = zero; } else { - *m = fcmult(1.0/denom, cadd(fcmult(n, sumxy), cneg(fcmult(sumx,sumy)))); - *b = fcmult(1.0/denom, cadd(fcmult(sumx2,sumy), cneg(fcmult(sumx, sumxy)))); + *m = fcmult(1.0 / denom, cadd(fcmult(n, sumxy), cneg(fcmult(sumx, sumy)))); + *b = fcmult(1.0 / denom, + cadd(fcmult(sumx2, sumy), cneg(fcmult(sumx, sumxy)))); } } - #ifdef __UNITTEST__ - static float x[] = {1, 2, 7, 8}; -static COMP y[] = { - {-0.70702, 0.70708}, - {-0.77314, 0.63442}, - {-0.98083, 0.19511}, - {-0.99508, 0.09799} -}; - +static COMP y[] = {{-0.70702, 0.70708}, + {-0.77314, 0.63442}, + {-0.98083, 0.19511}, + {-0.99508, 0.09799}}; int main(void) { - float x1; - COMP m,b,yfit; + float x1; + COMP m, b, yfit; - linreg(&m, &b, x, y, sizeof(x)/sizeof(float)); + linreg(&m, &b, x, y, sizeof(x) / sizeof(float)); - for (x1=1; x1<=8; x1++) { - yfit = cadd(fcmult(x1, m),b); - printf("%f %f\n", yfit.real, yfit.imag); - } + for (x1 = 1; x1 <= 8; x1++) { + yfit = cadd(fcmult(x1, m), b); + printf("%f %f\n", yfit.real, yfit.imag); + } - return 0; + return 0; } #endif - |
