tstddev.c - numtools - perform numerical operations on vectors and matrices in unix pipes
(HTM) git clone git://src.adamsgaard.dk/numtools
(DIR) Log
(DIR) Files
(DIR) Refs
(DIR) README
(DIR) 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", errstr, optarg);
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 }