densitytreeparticleresampler.cpp

来自「dysii是一款非常出色的滤波函数库」· C++ 代码 · 共 118 行

CPP
118
字号
#include "DensityTreeParticleResampler.hpp"#include "../aux/DensityTreeMixturePdf.hpp"#include <vector>#include <set>namespace aux = indii::ml::aux;using namespace indii::ml::filter;DensityTreeParticleResampler::DensityTreeParticleResampler(    const unsigned int P, const aux::DensityTreeFactory& factory) : P(P),    factory(factory) {  //}DensityTreeParticleResampler::DensityTreeParticleResampler(    const unsigned int P) : P(P), factory(P) {  //}DensityTreeParticleResampler::~DensityTreeParticleResampler() {  //}aux::DiracMixturePdf DensityTreeParticleResampler::resample(    aux::DiracMixturePdf& p) {  /* degenerate case */  if (p.getNumComponents() == 0) {    return p;  }    p.redistributeByCount();  p.distributedNormalise();  const unsigned int N = p.getDimensions();  unsigned int i, j;  double w, qw, pw;  aux::DiracMixturePdf resampled(N);  /* create density tree mixture from particles, one tree per node */  aux::DensityTreePdf tree(p, factory);  aux::DensityTreeMixturePdf mixture(N);  mixture.addComponent(tree, p.getTotalWeight());  /* create density tree importance distribution */  aux::DensityTreeFactory importanceFactory(0.25*sqrt(P), 4.0*log(P)/log(2.0), 0.3,      aux::DensityTreeFactory::SPLIT_VARIANCE);  aux::DensityTreePdf importance(p, importanceFactory);  aux::DensityTreeMixturePdf importanceMixture(N);  importanceMixture.addComponent(importance, p.getTotalWeight());    /* determine extreme particles in each dimension */  const aux::DiracMixturePdf::weighted_component_vector& particles =       p.getComponents();  aux::vector lower(particles[0].x), upper(particles[0].x);  std::vector<unsigned int> lowerIndex(N), upperIndex(N);  lowerIndex.clear();  upperIndex.clear();    for (i = 1; i < P; i++) {    for (j = 0; j < N; j++) {      if (particles[i].x(j) < lower(j)) {        lower(j) = particles[i].x(j);        lowerIndex[j] = i;      } else if (particles[i].x(j) > upper(j)) {        upper(j) = particles[i].x(j);        upperIndex[j] = i;      }    }  }  std::set<unsigned int> extremes;  std::set<unsigned int>::iterator extremesIter, extremesEnd;  for (i = 0; i < N; i++) {    extremes.insert(lowerIndex[i]);    extremes.insert(upperIndex[i]);  }    /* sample extreme particles */  extremesIter = extremes.begin();  extremesEnd = extremes.end();  while (extremesIter != extremesEnd) {    pw = mixture.densityAt(particles[*extremesIter].x);    qw = importanceMixture.densityAt(particles[*extremesIter].x);    w = P * pw / ((P - extremes.size()) * qw + 1);    resampled.addComponent(particles[*extremesIter].x, w);    extremesIter++;  }    /* importance sample remaining particles from tree */    std::vector<aux::vector> xs(importanceMixture.distributedSample(P - extremes.size()));  std::vector<aux::vector>::iterator xsIter, xsEnd;  xsIter = xs.begin();  xsEnd = xs.end();  while (xsIter != xsEnd) {    pw = mixture.densityAt(*xsIter);    qw = importanceMixture.densityAt(*xsIter);    w = P * pw / ((P - extremes.size()) * qw);    resampled.addComponent(*xsIter, w);    xsIter++;  }  /*std::vector<aux::vector> xs(mixture.distributedSample(P));  std::vector<aux::vector>::iterator xsIter, xsEnd;  xsIter = xs.begin();  xsEnd = xs.end();  while (xsIter != xsEnd) {    resampled.addComponent(*xsIter);    xsIter++;  }*/  return resampled;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?