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 }