welford_mean.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. /**
  2. * @file welford_mean.h
  3. * @author liuyang (liuyangzys@outlook.com)
  4. * @brief Welford's online algorithm for computing mean and variance
  5. * @version 0.1
  6. * @date 2023-07-20
  7. *
  8. * @copyright Copyright (c) 2023
  9. *
  10. */
  11. #pragma once
  12. #include <stdbool.h>
  13. #include <stddef.h>
  14. #include <stdint.h>
  15. typedef struct {
  16. float _mean;
  17. float _M2;
  18. float _mean_accum;
  19. float _M2_accum;
  20. uint16_t _count;
  21. } WelfordMean_t;
  22. bool welford_mean_valid(WelfordMean_t *wm);
  23. void welford_mean_reset(WelfordMean_t *wm);
  24. bool welford_mean_updata(WelfordMean_t *wm, float new_val);
  25. int welford_mean_get_count(WelfordMean_t *wm);
  26. float welford_mean_get_mean(WelfordMean_t *wm);
  27. float welford_mean_get_variance(WelfordMean_t *wm);
  28. float welford_mean_get_stddev(WelfordMean_t *wm);
  29. typedef struct {
  30. float _mean[3];
  31. float _mean_accum[3];
  32. float _M2[3][3];
  33. float _M2_accum[3][3];
  34. uint16_t _count;
  35. } WelfordMeanVector3f_t;
  36. bool welford_mean_vector3f_valid(WelfordMeanVector3f_t *wm);
  37. void welford_mean_vector3f_reset(WelfordMeanVector3f_t *wm);
  38. bool welford_mean_vector3f_updata(WelfordMeanVector3f_t *wm, float new_val[3]);
  39. int welford_mean_vector3f_get_count(WelfordMeanVector3f_t *wm);
  40. bool welford_mean_vector3f_get_mean(WelfordMeanVector3f_t *wm, float mean[3]);
  41. bool welford_mean_vector3f_get_variance(WelfordMeanVector3f_t *wm,
  42. float variance[3]);
  43. float welford_mean_vector3f_get_covariance(WelfordMeanVector3f_t *wm, int x,
  44. int y);