added von mises distributionb
quick&dirty: added activity to the grid-walkers
This commit is contained in:
56
math/distribution/VonMises.h
Normal file
56
math/distribution/VonMises.h
Normal file
@@ -0,0 +1,56 @@
|
||||
#ifndef K_MATH_DISTRIBUTION_VONMISES_H
|
||||
#define K_MATH_DISTRIBUTION_VONMISES_H
|
||||
|
||||
#include <cmath>
|
||||
#include <random>
|
||||
|
||||
#include "../Math.h"
|
||||
#include "Bessel.h"
|
||||
#include "LUT.h"
|
||||
|
||||
namespace Distribution {
|
||||
|
||||
/** von-mises distribution */
|
||||
template <typename T> class VonMises {
|
||||
|
||||
private:
|
||||
|
||||
/** center of the distribution */
|
||||
const T mu;
|
||||
|
||||
/** like 1.0/variance of the distribution */
|
||||
const T kappa;
|
||||
|
||||
/** pre-calcuated look-up-table */
|
||||
std::vector<T> lut;
|
||||
|
||||
/** helper for modified bessel I_0(kappa) */
|
||||
Bessel<T> bessel;
|
||||
|
||||
public:
|
||||
|
||||
/** ctor */
|
||||
VonMises(const T mu, const T kappa) : mu(mu), kappa(kappa) {
|
||||
|
||||
}
|
||||
|
||||
LUT<T> getLUT() const {
|
||||
return LUT<T>(*this, -M_PI, +M_PI, 10000);
|
||||
}
|
||||
|
||||
/** get probability for the given value */
|
||||
T getProbability(const T _val) const {
|
||||
|
||||
const T val = Math::clamp((T)-M_PI, (T)+M_PI, _val);
|
||||
|
||||
return
|
||||
std::exp(kappa * std::cos(val - mu)) /
|
||||
(2 * M_PI * bessel.getModified(0, kappa));
|
||||
|
||||
}
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // K_MATH_DISTRIBUTION_VONMISES_H
|
||||
Reference in New Issue
Block a user