10 #define FEATURECOVAR_H
21 template<
class F,
int DIM_FEAT>
30 unsigned int size()
const {
return DIM_FEAT; };
40 double rawCovMat[DIM_FEAT][DIM_FEAT];
41 double invRawCovMat[DIM_FEAT][DIM_FEAT];
42 double unitVarCovMat[DIM_FEAT][DIM_FEAT];
43 double varScaledCovMat[DIM_FEAT][DIM_FEAT];
44 double invUnitVarCovMat[DIM_FEAT][DIM_FEAT];
45 double means[DIM_FEAT];
47 const std::vector<F>& values;
48 std::vector<F> zeroMeanValues;
49 std::vector<F> varScaledValues;
50 std::vector<F> unitVarianceValues;
52 int invert (
double a[][2*DIM_FEAT],
double ainv[][2*DIM_FEAT],
int n);
64 template<
class F,
int DIM_FEAT>
68 for(
int r = 0; r < DIM_FEAT; r++)
69 for(
int c = 0; c < DIM_FEAT; c++)
73 unitVarCovMat[r][c] = 0;
74 invUnitVarCovMat[r][c] = 0;
75 varScaledCovMat[r][c] = 0;
79 template<
class F,
int DIM_FEAT>
85 double tmp[2*DIM_FEAT][2*DIM_FEAT];
86 double res[2*DIM_FEAT][2*DIM_FEAT];
88 cout <<
"Computing covariance matrix... " << endl;
92 int num = values.size();
96 for (
int v = 0; v < num; v++)
98 for(
int d = 0; d < DIM_FEAT; d++)
100 means[d] += values[v][d] / num;
104 cout <<
"Means: " << endl;
106 for (
int d = 0; d < DIM_FEAT; d++)
107 cout << d <<
": " << means[d] << endl;
112 for (
int r = 0; r < DIM_FEAT; r++)
114 for (
int c = 0; c < DIM_FEAT; c++)
116 for (
int v = 0; v < num; v++)
117 rawCovMat[r][c] += (values[v][r] - means[r]) * (values[v][c] - means[c]) / num;
123 for (
int r = 0; r < DIM_FEAT; r++)
124 for (
int c = 0; c < DIM_FEAT; c++)
125 tmp[r][c] = rawCovMat[r][c];
127 invert(tmp, res, DIM_FEAT);
131 for (
int r = 0; r < DIM_FEAT; r++)
132 for (
int c = 0; c < DIM_FEAT; c++)
133 invRawCovMat[r][c] = res[r][c];
136 zeroMeanValues = values;
138 for (
int i = 0; i < num; i++)
140 for (
int d = 0; d < DIM_FEAT; d++)
141 zeroMeanValues[i][d] -= means[d];
146 varScaledValues = zeroMeanValues;
148 for (
int i = 0; i < num; i++)
150 for (
int d = 0; d < DIM_FEAT; d++)
151 varScaledValues[i][d] /= rawCovMat[d][d];
157 unitVarianceValues = zeroMeanValues;
159 for (
int i = 0; i < num; i++)
161 for (
int d = 0; d < DIM_FEAT; d++)
162 unitVarianceValues[i][d] /= sqrt(rawCovMat[d][d]);
167 for (
int r = 0; r < DIM_FEAT; r++)
169 for (
int c = 0; c < DIM_FEAT; c++)
171 for (
int v = 0; v < num; v++)
172 unitVarCovMat[r][c] += ((unitVarianceValues[v][r]) * (unitVarianceValues[v][c]) / num);
179 for (
int r = 0; r < DIM_FEAT; r++)
181 for (
int c = 0; c < DIM_FEAT; c++)
183 for (
int v = 0; v < num; v++)
184 varScaledCovMat[r][c] += ((varScaledValues[v][r]) * (varScaledValues[v][c]) / num);
193 for (
int r = 0; r < DIM_FEAT; r++)
194 for (
int c = 0; c < DIM_FEAT; c++)
195 tmp[r][c] = unitVarCovMat[r][c];
197 invert(tmp, res, DIM_FEAT);
201 for (
int r = 0; r < DIM_FEAT; r++)
202 for (
int c = 0; c < DIM_FEAT; c++)
203 invUnitVarCovMat[r][c] = res[r][c];
206 template<
class F,
int DIM_FEAT>
211 cout <<
"ORIGINAL (RAW) COVARIANCE MATRIX:" << endl << endl;;
212 for(
int r = 0; r < DIM_FEAT; r++)
214 for(
int c = 0; c < DIM_FEAT; c++)
216 cout << rawCovMat[r][c] <<
"\t";
222 cout <<
"INVERSE (RAW) COVARIANCE MATRIX:" << endl << endl;;
223 for(
int r = 0; r < DIM_FEAT; r++)
225 for(
int c = 0; c < DIM_FEAT; c++)
227 cout << invRawCovMat[r][c] <<
"\t";
234 cout <<
"VAR^-1-SCALED COVARIANCE MATRIX(EXPERIMENTAL):" << endl << endl;;
235 for(
int r = 0; r < DIM_FEAT; r++)
237 for(
int c = 0; c < DIM_FEAT; c++)
239 cout << varScaledCovMat[r][c] <<
"\t";
246 cout <<
"UNIT VARIANCE COVARIANCE MATRIX:" << endl << endl;;
247 for(
int r = 0; r < DIM_FEAT; r++)
249 for(
int c = 0; c < DIM_FEAT; c++)
251 cout << unitVarCovMat[r][c] <<
"\t";
257 cout <<
"INVERSE UNIT VARIANCE COVARIANCE MATRIX:" << endl << endl;;
258 for(
int r = 0; r < DIM_FEAT; r++)
260 for(
int c = 0; c < DIM_FEAT; c++)
262 cout << invUnitVarCovMat[r][c] <<
"\t";
270 template<
class F,
int DIM_FEAT>
273 return unitVarCovMat[r][c];
276 template<
class F,
int DIM_FEAT>
279 return invUnitVarCovMat[r][c];
282 template<
class F,
int DIM_FEAT>
285 return rawCovMat[r][c];
288 template<
class F,
int DIM_FEAT>
291 return invRawCovMat[r][c];
294 template<
class F,
int DIM_FEAT>
297 return varScaledCovMat[r][c];
300 template<
class F,
int DIM_FEAT>
306 template<
class F,
int DIM_FEAT>
316 const double Epsilon = 0.01;
322 for (i = 0; i < n; i++) {
323 for (j = 0; j < n; j++)
336 Maximum = fabs(a[s][s]);
340 for (i = s+1; i < n; i++)
341 if (fabs(a[i][s]) > Maximum) {
342 Maximum = fabs(a[i][s]) ;
346 fehler = (Maximum < Epsilon);
354 for (j = s ; j < 2*n; j++) {
356 a[s][j] = a[pzeile][j];
364 for (j = s; j < 2*n; j++)
365 a[s][j] = a[s][j] / f;
369 for (i = 0; i < n; i++ ) {
373 for (j = s; j < 2*n ; j++)
374 a[i][j] += f*a[s][j];
382 cout <<
"Inverse: Matrix ist singulär\n" << endl;
387 for (i = 0; i < n; i++) {
388 for (j = 0; j < n; j++) {
389 ainv[i][j] = a[i][n+j];
395 #endif // FEATURECOVAR_H
unsigned int size() const
Definition: FeatureCovar.h:30
double getInvRawCovMat(int r, int c) const
Definition: FeatureCovar.h:289
double getRawCovMat(int r, int c) const
Definition: FeatureCovar.h:283
double getMean(int d) const
Definition: FeatureCovar.h:301
double getVarScaledCovMat(int r, int c) const
Definition: FeatureCovar.h:295
double getUnitVarCovMat(int r, int c) const
Definition: FeatureCovar.h:271
void compute()
Definition: FeatureCovar.h:80
double getInvUnitVarCovMat(int r, int c) const
Definition: FeatureCovar.h:277
Definition: FeatureCovar.h:22
void print()
Definition: FeatureCovar.h:207
FeatureCovar(const std::vector< F > &values_)
Definition: FeatureCovar.h:65