tstdvar.c - numtools - perform numerical operations on vectors and matrices in … | |
git clone git://src.adamsgaard.dk/numtools | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
tstdvar.c (1562B) | |
--- | |
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: stdvar [-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, *stdvars = 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 !(stdvars = 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 stdvars[i] = 0.0; | |
67 for (j = 0; j < nr; j++) | |
68 stdvars[i] += pow(vals[j][i] - means[i], 2.0); | |
69 stdvars[i] /= (double)(nr - correction); | |
70 } | |
71 | |
72 printfarr(delimstr, prec, stdvars, nf); | |
73 if (finalnl) | |
74 putchar('\n'); | |
75 | |
76 free(means); | |
77 free(stdvars); | |
78 for (i = 0; i < nr; i++) | |
79 free(vals[i]); | |
80 free(vals); | |
81 | |
82 return 0; | |
83 } |