misc_math.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. #include "misc_math.h"
  2. #include <stdlib.h>
  3. #include <math.h>
  4. #define THRESHOLD_double 0.000001
  5. inline int double_eq(double f1, double f2)
  6. {
  7. return fabs(f1-f2) < THRESHOLD_double;
  8. }
  9. //Given a matrix, return the matrix containing an approximation of the gradient matrix dM/dx
  10. MAT * gradient_x(MAT * input)
  11. {
  12. int i, j;
  13. MAT * result = m_get(input->m, input->n);
  14. for(i = 0; i < result->m; i++)
  15. {
  16. for(j = 0; j < result->n; j++)
  17. {
  18. if(j==0)
  19. m_set_val(result, i, j, m_get_val(input, i, j+1) - m_get_val(input, i, j));
  20. else if(j==input->n-1)
  21. m_set_val(result, i, j, m_get_val(input, i, j) - m_get_val(input, i, j-1));
  22. else
  23. m_set_val(result, i, j, (m_get_val(input, i, j+1) - m_get_val(input, i, j-1)) / 2.0);
  24. }
  25. }
  26. return result;
  27. }
  28. //Given a matrix, return the matrix containing an approximation of the gradient matrix dM/dy
  29. MAT * gradient_y(MAT * input)
  30. {
  31. int i, j;
  32. MAT * result = m_get(input->m, input->n);
  33. for(i = 0; i < result->n; i++)
  34. {
  35. for(j = 0; j < result->m; j++)
  36. {
  37. if(j==0)
  38. m_set_val(result, j, i, m_get_val(input, j+1, i) - m_get_val(input, j, i));
  39. else if(j==input->m-1)
  40. m_set_val(result, j, i, m_get_val(input, j, i) - m_get_val(input, j-1, i));
  41. else
  42. m_set_val(result, j, i, (m_get_val(input, j+1, i) - m_get_val(input, j-1, i)) / 2.0);
  43. }
  44. }
  45. return result;
  46. }
  47. //Return the mean of the values in a vector
  48. double mean(VEC * in)
  49. {
  50. double sum = 0.0;
  51. int i;
  52. for(i = 0; i < in->dim; i++)
  53. sum+=v_get_val(in, i);
  54. return sum/(double)in->dim;
  55. }
  56. //Return the standard deviation of the values in a vector
  57. double std_dev(VEC * in)
  58. {
  59. double m = mean(in), sum =0.0;
  60. int i;
  61. for(i = 0; i < in->dim; i++)
  62. {
  63. double temp = v_get_val(in, i) - m;
  64. sum+=temp*temp;
  65. }
  66. return sqrt(sum/(double)in->dim);
  67. }