我在这里看了一些解决方案,但没有提供我所需要的:
我需要对角度数组(0到359.9,无负数)进行平均值计算 (A1 + A2 + A3 + An) / n
问题在于当你得到一个数组{1, 359, 2, 358}时,如果使用上面的公式计算平均值,则结果为180,但实际上应该是0。
有什么想法吗?
我在这里看了一些解决方案,但没有提供我所需要的:
我需要对角度数组(0到359.9,无负数)进行平均值计算 (A1 + A2 + A3 + An) / n
问题在于当你得到一个数组{1, 359, 2, 358}时,如果使用上面的公式计算平均值,则结果为180,但实际上应该是0。
有什么想法吗?
将每个角度的单位向量相加,然后将结果向量转换回角度。如果结果向量的长度为零,则输入相互抵消,结果不确定。
单位向量的长度为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));
1 + 359 + 2 + 358 = 360 + 360 = 720 degrees in total
720 / 4 = 360 / 2 = 180 degrees on average
问题不在于答案应该是零,而在于359度与-1度并不等价,因为角度绕着圆“另一边”。
求平均角度比听起来要棘手一些。 有一天我在工作中需要这样做,想分享一下我的发现。
在遇到几个陷阱之后,我得出以下定义: 平均值是使方差最小的值。
一旦给出平均值,就可以通过以下公式计算方差:
1. 将所有值以相同的角度移动,使平均值为180度。(这相当于在平均值相反的一侧“切割”圆形。) 2. 将所有角度归一化为0到360之间。 3. 计算正常平均值。 4. 通过以前移动值的角度来移回平均值(反转步骤1)。avg = ( (a1 + a2 + an) /n ) % 360