平均角度

5

我在这里看了一些解决方案,但没有提供我所需要的:

我需要对角度数组(0到359.9,无负数)进行平均值计算 (A1 + A2 + A3 + An) / n

问题在于当你得到一个数组{1, 359, 2, 358}时,如果使用上面的公式计算平均值,则结果为180,但实际上应该是0。

有什么想法吗?


2
问题在于角度的平均值并不是一种良好定义的操作;按照你的公式,它取决于你从哪里开始测量它们,例如,如果你使用一个(-180, 180]角度表示,你将得到你所想象的结果。你应该更好地解释一下你希望得到的一般性结果。 - Matteo Italia
6
为什么应该是0? - Jon Skeet
如果您有{0, 180},您希望得到什么输出?“正确”的答案是90还是270? - Nathan S.
问题在于,我们需要对角度取平均值,而不管它们位于哪个扇区,对于我们来说0 = 360 = 720等等。即使我们将0移动180度,仍会有另一个点具有相同的问题。在-180到180的情况下,平均值将是{-179, 179}。它应该给出180,而不是算术平均数0。 - Miro J.
适当的解决方案已经标记出来了。我只是为以后访问这个地方的所有人提供更多的信息。问题已经解决!请查看Mark的答案。 - Miro J.
显示剩余2条评论
4个回答

18

将每个角度的单位向量相加,然后将结果向量转换回角度。如果结果向量的长度为零,则输入相互抵消,结果不确定。

单位向量的长度为1,其x和y长度由角度的余弦和正弦给出。 因此,您可以像以下伪代码一样对示例进行平均:

x = cos(radians(1)) + cos(radians(359)) + cos(radians(2)) + cos(radians(358));
y = sin(radians(1)) + sin(radians(359)) + sin(radians(2)) + sin(radians(358));
angle = degrees(atan2(y, x));

抱歉,我不明白你所说的单位向量是什么意思。你能用我上面提供的数字举个例子来解释一下吗? - Miro J.
@Miroslav,我已经更新了答案。不幸的是,我不知道.NET的正确语法,但这应该足够接近让你理解了。 - Mark Ransom
没问题,你帮了大忙。我们正在实现它。 - Miro J.
非常感谢,这节省了我很多麻烦! - Echelon
这是一个聪明而简单的解决方案,对于大多数情况都非常有效。然而,并不是所有的值都具有相等的权重。例如,0、60、180的平均值应该是多少?通常人们会说是80,但由于0和180互相抵消,所以你会得到60。请参见下面的答案,了解另一种选择。 - Martin Vatshelle

0
一个从圆形中离开的射线可以用多种方式表示。它可以是0度、360度、720度等。你需要确定对于你的情况什么是正确可接受的答案,并在呈现之前将中间答案转换为最终答案。
1 + 359 + 2 + 358 = 360 + 360 = 720 degrees in total
720 / 4 = 360 / 2 = 180 degrees on average

问题不在于答案应该是零,而在于359度与-1度并不等价,因为角度绕着圆“另一边”。


0

求平均角度比听起来要棘手一些。 有一天我在工作中需要这样做,想分享一下我的发现。

  1. 将360添加到任何一个值中不应改变您的平均值。
    例如:avg(2 4 18) = avg(362,4,18) = 8
  2. 将所有值移位相同的常量值应将平均值同样地移位。
    例如:avg(2-3,4-3,18-3) = avg(359,1,15) = 8-3
  3. 如果您的度数“抵消”,例如0、120、240,则平均值未定义
    (即有几个同样好的答案)。
    我看不出有其他处理方法,除了给出错误消息。

在遇到几个陷阱之后,我得出以下定义: 平均值是使方差最小的值。

一旦给出平均值,就可以通过以下公式计算方差:

1. 将所有值以相同的角度移动,使平均值为180度。(这相当于在平均值相反的一侧“切割”圆形。) 2. 将所有角度归一化为0到360之间。 3. 计算正常平均值。 4. 通过以前移动值的角度来移回平均值(反转步骤1)。
这需要O(n^2)时间。
但是,如果您所有的值都位于180度的跨度内,您可以将值移动,使得0包含在最大值差距中,然后计算正常平均值。这需要O(n)时间。

-1
你想四舍五入吗,即使是 359 度也应该变成 0 度吗?
将结果对 360 取模。
avg = ( (a1 + a2 + an) /n ) % 360

1
这样做行不通 - 如问题所述,结果将为180度。 - Konrad Rudolph
抱歉,我认为它没有产生期望的0的结果! - Miro J.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接