circ_median.m 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. function med = circ_median(alpha,dim)
  2. %
  3. % med = circ_median(alpha)
  4. % Computes the median direction for circular data.
  5. %
  6. % Input:
  7. % alpha sample of angles in radians
  8. % [dim compute along this dimension, default is 1, must
  9. % be either 1 or 2 for circ_median]
  10. %
  11. % Output:
  12. % mu mean direction
  13. %
  14. % PHB 3/19/2009
  15. %
  16. % References:
  17. % Biostatistical Analysis, J. H. Zar (26.6)
  18. %
  19. % Circular Statistics Toolbox for Matlab
  20. % By Philipp Berens, 2009
  21. % berens@tuebingen.mpg.de - www.kyb.mpg.de/~berens/circStat.html
  22. if nargin < 2
  23. dim = 1;
  24. end
  25. M = size(alpha);
  26. for i=1:M(3-dim)
  27. if dim == 2
  28. beta = alpha(i,:)';
  29. elseif dim ==1
  30. beta = alpha(:,i);
  31. else
  32. error('circ_median only works along first two dimensions')
  33. end
  34. beta = mod(beta,2*pi);
  35. n = size(beta,1);
  36. dd = circ_dist2(beta,beta);
  37. m1 = sum(dd>=0,1);
  38. m2 = sum(dd<0,1);
  39. dm = abs(m1-m2);
  40. if mod(n,2)==1
  41. [m idx] = min(dm);
  42. else
  43. m = min(dm);
  44. idx = find(dm==m,2);
  45. end
  46. if m > 1
  47. warning('Ties detected.') %#ok<WNTAG>
  48. end
  49. md = circ_mean(beta(idx));
  50. if abs(circ_dist(circ_mean(beta),md)) > abs(circ_dist(circ_mean(beta),md+pi))
  51. md = mod(md+pi,2*pi);
  52. end
  53. med(i) = md;
  54. end
  55. if dim == 2
  56. med = med';
  57. end