# HG changeset patch # User Chris Cannam # Date 1396888459 -3600 # Node ID 9e2d1f6cd43a1b72ef95a0e9275867a26964b257 # Parent 782ca0d9ff3e54b333e17fa2b8538c51814a141d Fix incorrect normalisation of source activation matrix diff -r 782ca0d9ff3e -r 9e2d1f6cd43a src/EM.cpp --- a/src/EM.cpp Mon Apr 07 17:07:36 2014 +0100 +++ b/src/EM.cpp Mon Apr 07 17:34:19 2014 +0100 @@ -47,7 +47,6 @@ } m_sources = Grid(m_instruments); - for (int i = 0; i < m_instruments; ++i) { m_sources[i] = V(m_notes); for (int n = 0; n < m_notes; ++n) { @@ -83,6 +82,24 @@ } void +EM::normaliseSources(Grid &sources) +{ + V denominators(sources[0].size()); + + for (int i = 0; i < (int)sources.size(); ++i) { + for (int j = 0; j < (int)sources[i].size(); ++j) { + denominators[j] += sources[i][j]; + } + } + + for (int i = 0; i < (int)sources.size(); ++i) { + for (int j = 0; j < (int)sources[i].size(); ++j) { + sources[i][j] /= denominators[j]; + } + } +} + +void EM::iterate(V column) { normalise(column); @@ -155,8 +172,8 @@ newSources[i][n] = pow(newSources[i][n], m_sourceSparsity); } } - normalise(newSources[i]); } + normaliseSources(newSources); m_pitches = newPitches; m_sources = newSources; diff -r 782ca0d9ff3e -r 9e2d1f6cd43a src/EM.h --- a/src/EM.h Mon Apr 07 17:07:36 2014 +0100 +++ b/src/EM.h Mon Apr 07 17:34:19 2014 +0100 @@ -58,6 +58,7 @@ int m_highest; void normalise(V &column); + void normaliseSources(Grid &grid); void expectation(const V &column); void maximisation(const V &column);