| tstddev.c - numtools - perform numerical operations on vectors and matrices in … | |
| git clone git://src.adamsgaard.dk/numtools | |
| Log | |
| Files | |
| Refs | |
| README | |
| LICENSE | |
| --- | |
| tstddev.c (1582B) | |
| --- | |
| 1 #include <err.h> | |
| 2 #include <stdio.h> | |
| 3 #include <stdlib.h> | |
| 4 #include <unistd.h> | |
| 5 #include <math.h> | |
| 6 #include <limits.h> | |
| 7 #include <unistd.h> | |
| 8 | |
| 9 #include "util.h" | |
| 10 | |
| 11 static void | |
| 12 usage(void) | |
| 13 { | |
| 14 errx(1, "usage: stddev [-d delimstr] [-n] [-p prec] [-u]"); | |
| 15 } | |
| 16 | |
| 17 int | |
| 18 main(int argc, char *argv[]) | |
| 19 { | |
| 20 int ch, prec = 17, finalnl = 1; | |
| 21 size_t i, j, nf = 0, nr = 0, correction = 1; | |
| 22 double *means = NULL, *stdvals = NULL, **vals = NULL; | |
| 23 const char *errstr; | |
| 24 char *delimstr = "\t"; | |
| 25 | |
| 26 if (pledge("stdio", NULL) == -1) | |
| 27 err(2, "pledge"); | |
| 28 | |
| 29 while ((ch = getopt(argc, argv, "d:np:u")) != -1) { | |
| 30 switch (ch) { | |
| 31 case 'd': | |
| 32 delimstr = optarg; | |
| 33 break; | |
| 34 case 'n': | |
| 35 finalnl = 0; | |
| 36 break; | |
| 37 case 'p': | |
| 38 prec = strtonum(optarg, -10, INT_MAX, &errstr); | |
| 39 if (errstr != NULL) | |
| 40 errx(1, "bad precision value, %s: %s", e… | |
| 41 break; | |
| 42 case 'u': | |
| 43 correction = 0; | |
| 44 break; | |
| 45 default: | |
| 46 usage(); | |
| 47 } | |
| 48 } | |
| 49 /*argc -= optind;*/ | |
| 50 /*argv += optind;*/ | |
| 51 | |
| 52 nr = fscanmatrix(stdin, &vals, &nf); | |
| 53 | |
| 54 if (!(means = calloc(nf, sizeof(double))) || | |
| 55 !(stdvals = calloc(nf, sizeof(double)))) | |
| 56 err(1, "calloc"); | |
| 57 | |
| 58 for (i = 0; i < nf; i++) { | |
| 59 means[i] = 0.0; | |
| 60 for (j = 0; j < nr; j++) | |
| 61 means[i] += vals[j][i]; | |
| 62 means[i] /= (double)nr; | |
| 63 } | |
| 64 | |
| 65 for (i = 0; i < nf; i++) { | |
| 66 stdvals[i] = 0.0; | |
| 67 for (j = 0; j < nr; j++) | |
| 68 stdvals[i] += pow(vals[j][i] - means[i], 2.0); | |
| 69 stdvals[i] = sqrt(stdvals[i] / ((double)(nr - correction… | |
| 70 } | |
| 71 | |
| 72 printfarr(delimstr, prec, stdvals, nf); | |
| 73 if (finalnl) | |
| 74 putchar('\n'); | |
| 75 | |
| 76 free(means); | |
| 77 free(stdvals); | |
| 78 for (i = 0; i < nr; i++) | |
| 79 free(vals[i]); | |
| 80 free(vals); | |
| 81 | |
| 82 return 0; | |
| 83 } |