为了账号安全,请及时绑定邮箱和手机立即绑定

您如何计算一组循环数据的平均值?

您如何计算一组循环数据的平均值?

我想计算一组循环数据的平均值。例如,我可能从罗盘的读取中获得了一些样本。当然,问题在于如何处理环绕。相同的算法可能对表盘有用。实际的问题更加复杂-统计在“环绕”的球体或代数空间(例如加性群mod n)中意味着什么。答案可能不是唯一的,例如359度和1度的平均值可以是0度或180度,但从统计学上讲0更好。对我来说,这是一个真正的编程问题,我试图使它看起来不只是一个数学问题。
查看完整描述

3 回答

?
慕田峪4524236

TA贡献1875条经验 获得超5个赞

我看到了问题-例如,如果您有一个45'角和315'角,则“自然”平均值将为180',但您想要的值实际上是0'。


我认为Starblue正在发展。只需计算每个角度的(x,y)笛卡尔坐标,然后将这些结果矢量相加即可。最终矢量的角度偏移应该是您所需的结果。


x = y = 0

foreach angle {

    x += cos(angle)

    y += sin(angle)

}

average_angle = atan2(y, x)

我现在暂时忽略指南针的航向是从北开始,然后顺时针旋转,而“常规”笛卡尔坐标沿X轴从零开始,然后逆时针旋转。无论如何,数学应该以相同的方式计算。


查看完整回答
反对 回复 2019-11-22
?
墨色风雨

TA贡献1853条经验 获得超6个赞

对于两个角度的特殊情况:


答案((a + b)mod 360)/ 2是错误的。对于角度350和2,最接近的点是356,而不是176。


单位向量和trig解可能太昂贵。


我从一点点修补中得到的是:


diff = ( ( a - b + 180 + 360 ) mod 360 ) - 180

angle = (360 + b + ( diff / 2 ) ) mod 360

0,180-> 90(对此有两个答案:该方程式采用a的顺时针答案)

180,0-> 270(请参见上文)

180,1-> 90.5

1,180-> 90.5

20、350-> 5

350、20-> 5(以下所有示例也可以正确反向)

10、20-> 15

350,2-> 356

359,0-> 359.5

180、180-> 180


查看完整回答
反对 回复 2019-11-22
  • 3 回答
  • 0 关注
  • 1287 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信