numtools

perform numerical operations on vectors and matrices in unix pipes
git clone git://src.adamsgaard.dk/numtools # fast
git clone https://src.adamsgaard.dk/numtools.git # slow
Log | Files | Refs | README | LICENSE Back to index

stdvar.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", 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 	    !(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 }