Introduction
Introduction Statistics Contact Development Disclaimer Help
tadd stddev(1) and stdvar(1) - numtools - perform numerical operations on vecto…
git clone git://src.adamsgaard.dk/numtools
Log
Files
Refs
README
LICENSE
---
commit 8ea1920df26393631c033b2e3955d88e6e20eaa2
parent 19cc9e1694767e6534501210180a9e8882fb85ca
Author: Anders Damsgaard <[email protected]>
Date: Mon, 9 May 2022 15:55:03 +0200
add stddev(1) and stdvar(1)
Diffstat:
M Makefile | 4 ++++
A stddev.1 | 40 +++++++++++++++++++++++++++++…
A stddev.c | 64 +++++++++++++++++++++++++++++…
A stdvar.1 | 40 +++++++++++++++++++++++++++++…
A stdvar.c | 64 +++++++++++++++++++++++++++++…
5 files changed, 212 insertions(+), 0 deletions(-)
---
diff --git a/Makefile b/Makefile
t@@ -15,6 +15,8 @@ BIN = \
randcounts \
range \
rangetest \
+ stddev \
+ stdvar \
sum \
transpose \
t@@ -59,6 +61,8 @@ min: min.o
randcounts: randcounts.o
range: range.o
rangetest: rangetest.o
+stddev: stddev.o
+stdvar: stdvar.o
sum: sum.o
transpose: transpose.o
diff --git a/stddev.1 b/stddev.1
t@@ -0,0 +1,40 @@
+.Dd $Mdocdate$
+.Dt STDDEV 1
+.Os
+.Sh NAME
+.Nm stddev
+.Nd returns the standard deviation for each column
+.Sh SYNOPSIS
+.Nm
+.Op Fl u
+.Sh DESCRIPTION
+.Nm
+returns the corrected sample standard deviation (s) for each column of
+standard input.
+Input fields must be tab-separated and each line most contain the same
+number of fields.
+The output is always in full double precision.
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl u
+Return the uncorrected sample standard deviation instead.
+.El
+.Sh EXAMPLES
+Compute the corrected standard deviation for some input numbers:
+.Pp
+.Dl $ printf '10\n8\n10\n8\n8\n4\n' | stddev
+.Dl 2.1908902300206643
+.Pp
+Same as the previous example, but return the uncorrected standard
+deviation:
+.Dl $ printf '10\n8\n10\n8\n8\n4\n' | stddev -u
+.Dl 2
+.Sh SEE ALSO
+.Xr max 1 ,
+.Xr mean 1 ,
+.Xr min 1 ,
+.Xr stdvar 1 ,
+.Xr sum 1
+.Sh AUTHORS
+.An Anders Damsgaard Aq Mt [email protected]
diff --git a/stddev.c b/stddev.c
t@@ -0,0 +1,64 @@
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <math.h>
+
+#include "arg.h"
+#include "util.h"
+
+char *argv0;
+
+static void
+usage(void)
+{
+ errx(1, "usage: %s [-u]\n", argv0);
+}
+
+int
+main(int argc, char *argv[])
+{
+ size_t i, j, nf = 0, nr = 0, correction = 1;
+ double *means = NULL, *stdvars = NULL, **vals = NULL;
+
+ if (pledge("stdio", NULL) == -1)
+ err(2, "pledge");
+
+ ARGBEGIN {
+ case 'u':
+ correction = 0;
+ break;
+ default:
+ usage();
+ } ARGEND;
+
+ nr = fscanmatrix(stdin, &vals, &nf);
+
+ if (!(means = calloc(nf, sizeof(double))) ||
+ !(stdvars = calloc(nf, sizeof(double))))
+ err(1, "calloc");
+
+ for (i = 0; i < nf; i++) {
+ means[i] = 0.0;
+ for (j = 0; j < nr; j++)
+ means[i] += vals[j][i];
+ means[i] /= (double)nr;
+ }
+
+ for (i = 0; i < nf; i++) {
+ stdvars[i] = 0.0;
+ for (j = 0; j < nr; j++)
+ stdvars[i] += pow(vals[j][i] - means[i], 2.0);
+ stdvars[i] = sqrt(stdvars[i] / ((double)(nr - correction)));
+ }
+
+ printarr(stdvars, nf);
+
+ free(means);
+ free(stdvars);
+ for (i = 0; i < nr; i++)
+ free(vals[i]);
+ free(vals);
+
+ return 0;
+}
diff --git a/stdvar.1 b/stdvar.1
t@@ -0,0 +1,40 @@
+.Dd $Mdocdate$
+.Dt STDVAR 1
+.Os
+.Sh NAME
+.Nm stdvar
+.Nd returns the standard variance for each column
+.Sh SYNOPSIS
+.Nm
+.Op Fl u
+.Sh DESCRIPTION
+.Nm
+returns the corrected sample standard variance (s²) for each column
+of standard input.
+Input fields must be tab-separated and each line most contain the same
+number of fields.
+The output is always in full double precision.
+.Pp
+The options are as follows:
+.Bl -tag -width Ds
+.It Fl u
+Return the uncorrected sample standard variance instead.
+.El
+.Sh EXAMPLES
+Compute the corrected standard variance for some input numbers:
+.Pp
+.Dl $ printf '10\n8\n10\n8\n8\n4\n' | stdvar
+.Dl 4.7999999999999998
+.Pp
+Same as the previous example, but return the uncorrected standard
+variance:
+.Dl $ printf '10\n8\n10\n8\n8\n4\n' | stdvar -u
+.Dl 4
+.Sh SEE ALSO
+.Xr max 1 ,
+.Xr mean 1 ,
+.Xr min 1 ,
+.Xr stddev 1 ,
+.Xr sum 1
+.Sh AUTHORS
+.An Anders Damsgaard Aq Mt [email protected]
diff --git a/stdvar.c b/stdvar.c
t@@ -0,0 +1,64 @@
+#include <err.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <math.h>
+
+#include "arg.h"
+#include "util.h"
+
+char *argv0;
+
+static void
+usage(void)
+{
+ errx(1, "usage: %s [-u]\n", argv0);
+}
+
+int
+main(int argc, char *argv[])
+{
+ size_t i, j, nf = 0, nr = 0, correction = 1;
+ double *means = NULL, *stdvars = NULL, **vals = NULL;
+
+ if (pledge("stdio", NULL) == -1)
+ err(2, "pledge");
+
+ ARGBEGIN {
+ case 'u':
+ correction = 0;
+ break;
+ default:
+ usage();
+ } ARGEND;
+
+ nr = fscanmatrix(stdin, &vals, &nf);
+
+ if (!(means = calloc(nf, sizeof(double))) ||
+ !(stdvars = calloc(nf, sizeof(double))))
+ err(1, "calloc");
+
+ for (i = 0; i < nf; i++) {
+ means[i] = 0.0;
+ for (j = 0; j < nr; j++)
+ means[i] += vals[j][i];
+ means[i] /= (double)nr;
+ }
+
+ for (i = 0; i < nf; i++) {
+ stdvars[i] = 0.0;
+ for (j = 0; j < nr; j++)
+ stdvars[i] += pow(vals[j][i] - means[i], 2.0);
+ stdvars[i] /= (double)(nr - correction);
+ }
+
+ printarr(stdvars, nf);
+
+ free(means);
+ free(stdvars);
+ for (i = 0; i < nr; i++)
+ free(vals[i]);
+ free(vals);
+
+ return 0;
+}
You are viewing proxied material from mx1.adamsgaard.dk. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.