annotate maths/KLDivergence.cpp @ 189:e4a57215ddee

Fix compiler warnings with -Wall -Wextra
author Chris Cannam
date Mon, 28 Sep 2015 12:33:17 +0100
parents e5907ae6de17
children bb78ca3fe7de
rev   line source
cannam@31 1 /* -*- c-basic-offset: 4 indent-tabs-mode: nil -*- vi:set ts=8 sts=4 sw=4: */
cannam@31 2
cannam@31 3 /*
cannam@31 4 QM DSP Library
cannam@31 5
cannam@31 6 Centre for Digital Music, Queen Mary, University of London.
cannam@31 7 This file copyright 2008 QMUL
Chris@84 8
Chris@84 9 This program is free software; you can redistribute it and/or
Chris@84 10 modify it under the terms of the GNU General Public License as
Chris@84 11 published by the Free Software Foundation; either version 2 of the
Chris@84 12 License, or (at your option) any later version. See the file
Chris@84 13 COPYING included with this distribution for more information.
cannam@31 14 */
cannam@31 15
cannam@31 16 #include "KLDivergence.h"
cannam@31 17
cannam@33 18 #include <cmath>
cannam@33 19
cannam@33 20 double KLDivergence::distanceGaussian(const vector<double> &m1,
cannam@33 21 const vector<double> &v1,
cannam@33 22 const vector<double> &m2,
cannam@33 23 const vector<double> &v2)
cannam@31 24 {
cannam@31 25 int sz = m1.size();
cannam@31 26
cannam@31 27 double d = -2.0 * sz;
cannam@74 28 double small = 1e-20;
cannam@31 29
cannam@31 30 for (int k = 0; k < sz; ++k) {
cannam@74 31
cannam@74 32 double kv1 = v1[k] + small;
cannam@74 33 double kv2 = v2[k] + small;
cannam@74 34 double km = (m1[k] - m2[k]) + small;
cannam@74 35
cannam@74 36 d += kv1 / kv2 + kv2 / kv1;
cannam@74 37 d += km * (1.0 / kv1 + 1.0 / kv2) * km;
cannam@31 38 }
cannam@31 39
cannam@31 40 d /= 2.0;
cannam@31 41
cannam@31 42 return d;
cannam@31 43 }
cannam@33 44
cannam@33 45 double KLDivergence::distanceDistribution(const vector<double> &d1,
cannam@33 46 const vector<double> &d2,
cannam@33 47 bool symmetrised)
cannam@33 48 {
cannam@33 49 int sz = d1.size();
cannam@33 50
cannam@33 51 double d = 0;
cannam@33 52 double small = 1e-20;
cannam@33 53
cannam@33 54 for (int i = 0; i < sz; ++i) {
cannam@33 55 d += d1[i] * log10((d1[i] + small) / (d2[i] + small));
cannam@33 56 }
cannam@33 57
cannam@33 58 if (symmetrised) {
cannam@33 59 d += distanceDistribution(d2, d1, false);
cannam@33 60 }
cannam@33 61
cannam@33 62 return d;
cannam@33 63 }
cannam@33 64