Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #ifndef MCL_3DL_ND_H
00031 #define MCL_3DL_ND_H
00032
00033 #define _USE_MATH_DEFINES
00034 #include <cmath>
00035 #include <Eigen/Core>
00036 #include <Eigen/LU>
00037
00038 namespace mcl_3dl
00039 {
00040 template <typename FLT_TYPE = float>
00041 class NormalLikelihood
00042 {
00043 public:
00044 explicit NormalLikelihood(const FLT_TYPE sigma)
00045 {
00046 a_ = 1.0 / sqrtf(2.0 * M_PI * sigma * sigma);
00047 sq2_ = sigma * sigma * 2.0;
00048 }
00049 FLT_TYPE operator()(const FLT_TYPE x) const
00050 {
00051 return a_ * expf(-x * x / sq2_);
00052 }
00053
00054 protected:
00055 FLT_TYPE a_;
00056 FLT_TYPE sq2_;
00057 };
00058
00059 template <typename FLT_TYPE = float, size_t DIMENSION = 6>
00060 class NormalLikelihoodNd
00061 {
00062 public:
00063 using Matrix = Eigen::Matrix<FLT_TYPE, DIMENSION, DIMENSION>;
00064 using Vector = Eigen::Matrix<FLT_TYPE, DIMENSION, 1>;
00065
00066 explicit NormalLikelihoodNd(const Matrix sigma)
00067 {
00068 a_ = 1.0 / (pow(2.0 * M_PI, 0.5 * DIMENSION) * sqrt(sigma.determinant()));
00069 sigma_inv_ = sigma.inverse();
00070 }
00071 FLT_TYPE operator()(const Vector x) const
00072 {
00073 return a_ * expf(-0.5 * x.transpose() * sigma_inv_ * x);
00074 }
00075
00076 protected:
00077 FLT_TYPE a_;
00078 Matrix sigma_inv_;
00079 };
00080 }
00081
00082 #endif // MCL_3DL_ND_H