summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwukong <wukong@longaeva>2019-01-05 16:33:14 -0800
committerwukong <wukong@longaeva>2019-01-05 16:33:14 -0800
commitddcb1f73423a9b47d9b457cf3b19f622b0aa567f (patch)
tree7045f95e61957e0a503cd2d4f830d4bc5ec8f138
parent9ac9c6f724c16a172ecb923a0360bc9a9ffc3806 (diff)
added min and max to mean and mean_avg, fixed regex bugs in mean
-rw-r--r--kalman_init.awk10
-rw-r--r--mean.awk29
-rw-r--r--mean_avg.awk10
3 files changed, 25 insertions, 24 deletions
diff --git a/kalman_init.awk b/kalman_init.awk
index 38cb66c..57f7bbd 100644
--- a/kalman_init.awk
+++ b/kalman_init.awk
@@ -54,22 +54,22 @@ NF != 0 {
### kalman gain
if (count[n] <= 1) {
- KG[n] = 1
+ Gk[n] = 1
est_err[n] = sqrt(diff[n]*diff[n]) + 2.0*sqrt(diff2[n]*diff2[n])
est_err_last[n] = sqrt(diff[n]*diff[n]) + 2.0*sqrt(diff2[n]*diff2[n])
}
else
- KG[n] = est_err_last[n]/(est_err_last[n] + meas_err[n])
+ Gk[n] = est_err_last[n]/(est_err_last[n] + meas_err[n])
### update estimate and estimated error
- est[n] = est_last[n] + KG[n]*($n - est_last[n])
- est_err[n] = (1.0 - KG[n])*est_err_last[n]
+ est[n] = est_last[n] + Gk[n]*($n - est_last[n])
+ est_err[n] = (1.0 - Gk[n])*est_err_last[n]
### visual check
printf "meas: " OFS OFMT OFS OFMT OFS OFMT, $n, meas_err[n], count[n]
printf "d1: " OFS OFMT, diff[n]
printf "d2: " OFS OFMT, diff2[n]
- printf "est: " OFS OFMT OFS OFMT OFS OFMT, est[n], est_err[n], KG[n]
+ printf "est: " OFS OFMT OFS OFMT OFS OFMT, est[n], est_err[n], Gk[n]
### update previously remembered values
last2[n] = last[n]
diff --git a/mean.awk b/mean.awk
index 816208c..b6a794e 100644
--- a/mean.awk
+++ b/mean.awk
@@ -1,36 +1,35 @@
#!/usr/bin/awk -f
### mean.awk
-# calculate mean average
+# calculate mean average of serialized numbers
BEGIN {
OFS = FS
- sign = "[+-±]?"
+ sign = "[+-]?"
decimal = "[0-9]+[.]?[0-9]*"
- fraction = "[.][0-9]*"
+ fraction = "[.][0-9]+"
exponent = "([Ee]" sign "[0-9]+)?"
number = "^" sign "(" decimal "|" fraction ")" exponent "$"
}
# Welford's 'online' algorithm for variance
NF > 0 {
- for (m=1; m<=NF; m++) {
- if (m ~ number) {
+ for (n=1; n<=NF; n++) {
+ if ($n ~ number) {
count += 1
- delta0 = $m - mean
- mean = mean + delta0/count
- delta1 = $m - mean
- M2 = M2 + delta0*delta1
- if (count > 1)
- var = M2/(count - 1)
- else
- var = "nan"
+ (count == 1 || $n < min) ? min = $n : min = min
+ (count == 1 || $n > max) ? max = $n : max = max
+ delta0 = $n - mean
+ mean += delta0/count
+ delta1 = $n - mean
+ M2 += delta0*delta1
+ (count > 1) ? var = M2/(count - 1) : var = "nan"
}
}
}
END {
- print "mean", "std_err", "std_dev", "count"
- print mean, sqrt(var/count), sqrt(var), count
+ print "mean", "std_err", "std_dev", "min", "max", "count"
+ print mean, sqrt(var/count), sqrt(var), min, max, count
}
diff --git a/mean_avg.awk b/mean_avg.awk
index ed6f81a..4bf7051 100644
--- a/mean_avg.awk
+++ b/mean_avg.awk
@@ -24,22 +24,24 @@ NF > 0 {
for (n=1; n <= NF; n++) {
if ($n ~ number) {
count[n] += 1
+ (count[n] == 1 || $n < min[n]) ? min[n] = $n : min[n] = min[n]
+ (count[n] == 1 || $n > max[n]) ? max[n] = $n : max[n] = max[n]
delta0[n] = $n - mean[n]
mean[n] += delta0[n]/count[n]
delta1[n] = $n - mean[n]
M2[n] += delta0[n]*delta1[n]
- (count[n] > 1) ? var[n] = M2[n]/(count[n] - 1) : var[n] = ""
+ (count[n] > 1) ? var[n] = M2[n]/(count[n] - 1) : var[n] = "nan"
}
}
}
END {
- print "col", "mean", "std_err", "std_dev", "count"
+ print "col", "mean", "std_err", "std_dev", "min", "max", "count"
for (n=1; n<=max_nf; n++) {
if (header[n])
- print header[n], mean[n], sqrt(var[n]/count[n]), sqrt(var[n]), count[n]
+ print header[n], mean[n], sqrt(var[n]/count[n]), sqrt(var[n]), min[n], max[n], count[n]
else
- print "col" n, mean[n], sqrt(var[n]/count[n]), sqrt(var[n]), count[n]
+ print "col" n, mean[n], sqrt(var[n]/count[n]), sqrt(var[n]), min[n], max[n], count[n]
}
}