13 #ifndef SPATIUM_STATS_H 14 #define SPATIUM_STATS_H 28 inline double mean(
const std::vector<double> &values)
32 const size_t count = values.size();
33 const double divider = static_cast<double>(1) / static_cast<double>(count);
34 for (
size_t i = 0; i < count; i++)
36 result += values[i] * divider;
47 inline double variance(
const std::vector<double> &values,
bool sample =
false)
50 const double m =
mean(values);
51 const size_t count = values.size();
52 const double divider = static_cast<double>(1) / (sample ? static_cast<double>(count) - 1 : static_cast<double>(count));
53 for (
size_t i = 0; i < count; i++)
55 const double diff = values[i] - m;
56 result += (diff * diff) * divider;
67 inline double stdDev(
const std::vector<double> &values,
bool sample =
false)
69 return sqrt(
variance(values, sample));
78 inline double covariance(
const std::vector<double> &values1,
const std::vector<double> &values2,
bool sample =
false)
80 if (values1.size() != values2.size())
86 const double m1 =
mean(values1);
87 const double m2 =
mean(values2);
88 const size_t count = values1.size();
89 const double divider = static_cast<double>(1) / (sample ? static_cast<double>(count) - 1 : static_cast<double>(count));
90 for (
size_t i = 0; i < count; i++)
92 result += ((values1[i] - m1) * (values2[i] - m2)) * divider;
100 const size_t inputRows = values.
rows();
101 const size_t outputSize = values.
cols();
102 Matrix result(outputSize, outputSize);
104 for (
size_t i = 0; i < outputSize; i++)
107 std::vector<double> column1(inputRows);
108 for(
size_t k = 0; k < inputRows; k++)
110 column1[k] = values(k,i);
113 for (
size_t j = 0; j < outputSize; j++)
124 std::vector<double> column2(inputRows);
125 for(
size_t l = 0; l < inputRows; l++)
127 column2[l] = values(l,j);
148 if (matrix.
rows() != 2 || matrix.
cols() != 2)
153 const double p = matrix(0,0);
154 const double q = matrix(0,1);
155 const double r = matrix(1,0);
156 const double s = matrix(1,1);
158 return solveQuadratic(1, -1 * (p + s), p*s - q*r, eigenval1, eigenval2);
174 if (matrix.
rows() != 2 || matrix.
cols() != 2)
180 if (eigenvec.size() != 2)
185 eigenvec[0] = matrix(0,1);
186 eigenvec[1] = eigenval - matrix(0,0);
198 #endif // SPATIUM_STATS_H double mean(const std::vector< double > &values)
Compute mean value.
Definition: stats.h:28
double covariance(const std::vector< double > &values1, const std::vector< double > &values2, bool sample=false)
Compute the covariance.
Definition: stats.h:78
size_t rows() const
Get the number of rows.
Definition: Matrix.h:137
int eigenvalues2(const Matrix &matrix, double &eigenval1, double &eigenval2)
Compute eigenvalues for 2-by-2 matrix.
Definition: stats.h:145
double variance(const std::vector< double > &values, bool sample=false)
Compute the variance.
Definition: stats.h:47
size_t cols() const
Get the number of columns.
Definition: Matrix.h:145
int solveQuadratic(double a, double b, double c, double &x1, double &x2)
Solve a quadratic equation: ax^2 + bx + c = 0.
Definition: Math.h:69
Mathematical matrix with an arbitrary number number of rows and columns.
Definition: Matrix.h:34
double stdDev(const std::vector< double > &values, bool sample=false)
Compute the standard deviation.
Definition: stats.h:67
bool eigenvector2(const Matrix &matrix, double eigenval, std::vector< double > &eigenvec)
Compute the eigenvector of a 2-by-2 matrix for a given eigenvalue.
Definition: stats.h:171