Program Listing for File math_utils.h

Return to documentation for file (include/lupnt/numerics/math_utils.h)

#pragma once

#include <random>
#include <tuple>
#include <utility>

#include "lupnt/core/constants.h"

namespace lupnt {

  template <typename Vec, std::size_t... Indices>
  auto unpackImpl(const Vec& vec, std::index_sequence<Indices...>) {
    return std::make_tuple(vec(Indices)...);
  }

  template <typename T, int Size> auto unpack(const Eigen::Matrix<T, Size, 1>& vec) {
    return unpackImpl(vec, std::make_index_sequence<Size>{});
  }

  template <typename T> VectorX<T> arange(T start, T stop, T step = 1);

  Real AngleBetweenVecs(const VecX& x, const VecX& y);

  Real Wrap2Pi(Real angle);
  Real Wrap2TwoPi(Real angle);
  VecX Wrap2Pi(VecX angle);
  VecX Wrap2TwoPi(VecX angle);

  Real Decimal2Decibel(Real x);
  VecX Decimal2Decibel(VecX x);
  MatX Decimal2Decibel(MatX x);

  Real Decibel2Decimal(Real x);
  VecX Decibel2Decimal(VecX x);
  MatX Decibel2Decimal(MatX x);

  Real round(Real x, int n = 0);
  Real frac(Real x);
  Real ceil(Real x);
  Real floor(Real x);
  Real mod(Real x, Real y);

  Vec3 Degrees2DegMinSec(Real deg);
  Real DegMinSec2Degrees(Vec3 hms);

  Real sind(Real x);
  Real cosd(Real x);
  Real tand(Real x);

  Real safe_acos(Real x);
  Real safe_asin(Real x);

  double J0Bessel(double x);
  double J1Bessel(double x);

  Real RootMeanSquare(VecX x);
  Real Percentile(VecX x, double p);
  Real Std(VecX x);
  double RootMeanSquareD(VecXd x);
  double PercentileD(VecXd x, double p);
  double StdD(VecXd x);

  double erfc(double x);
  double qfunc(double x);

  MatX SampleMVN(const VecX mean, const MatX cov, int nn, int seed = 0);
  double SampleRandNormal(double mean, double std, int seed = 0);

  MatX BlkDiag(const MatX& A, const MatX& B);
  MatXd BlkDiagD(const MatXd& A, const MatXd& B);

  template <typename T> Matrix<T, 3, 3> RotX(T angle);
  template <typename T> Matrix<T, 3, 3> RotY(T angle);
  template <typename T> Matrix<T, 3, 3> RotZ(T angle);
  template <typename T> Matrix<T, 3, 3> Skew(Vector<T, 3> x);

  VecXd ToDouble(const VecX& x);
  // MatXd ToDouble(const MatX& x);
  std::vector<double> ToDoubleVec(const VecX& x);
  std::vector<double> ToDoubleVec(const VecXd& x);
  std::vector<double> ToDoubleVec(const VecXi& x);

  Real RatioOfSectorToTriangleArea(Vec3 r1, Vec3 r2, Real tau);

  VecX arange(Real start, Real stop, Real step);

}  // namespace lupnt