26 if (min > max) std::swap(min, max);
27 if (max == min) max = min + 1;
35 if (min == 0.f) min = std::min(logthresh, max);
36 else min = log10f(min);
40 }
else if (max <= 0.f) {
44 if (max == 0.f) max = std::min(logthresh, min);
45 else max = log10f(-max);
55 max = log10f(std::max(max, -min));
56 min = std::min(logthresh, max);
61 if (min == max) min = max - 1;
67 if (value == 0.f)
return thresh;
68 return log10f(fabsf(value));
74 return powf(10.0, value);
78 sd(
const std::vector<float> &values,
size_t start,
size_t n)
80 float sum = 0.f, mean = 0.f, variance = 0.f;
81 for (
size_t i = 0; i < n; ++i) {
82 sum += values[start + i];
85 for (
size_t i = 0; i < n; ++i) {
86 float diff = values[start + i] - mean;
87 variance += diff * diff;
89 variance = variance / n;
90 return sqrtf(variance);
100 if (values.size() < 4)
return false;
101 std::sort(values.begin(), values.end());
102 size_t mi = values.size() / 2;
104 float sd0 =
sd(values, 0, mi);
105 float sd1 =
sd(values, mi, values.size() - mi);
107 SVDEBUG <<
"LogRange::useLogScale: sd0 = " 108 << sd0 <<
", sd1 = " << sd1 << endl;
110 if (sd0 == 0 || sd1 == 0)
return false;
114 if (std::max(sd0, sd1) / std::min(sd0, sd1) > 10.f)
return true;
static float sd(const std::vector< float > &values, size_t start, size_t n)
static void mapRange(float &min, float &max, float thresh=-10)
Map a linear range onto a logarithmic range.
static bool useLogScale(std::vector< float > values)
Estimate whether a set of values would be more properly shown using a logarithmic than a linear scale...
static float map(float value, float thresh=-10)
Map a value onto a logarithmic range.
static float unmap(float value)
Map a value from the logarithmic range back again.