gpt4 book ai didi

algorithm - 180° 偏移无关紧要时的角度加权平均值 (MATLAB)

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:45:54 29 4
gpt4 key购买 nike

我正在尝试计算一组角度的加权平均角度(范围:-0.5*pi 到 0.5*pi)。通常这不会是一个问题,因为这在之前的问题中已经解释过很多次,但在我的例子中,我试图计算当 pi (180°) 的偏移无关紧要时的平均角度。

例如,通过任何常规方法,-0.4*pi 和 0.4*pi 的循环平均值将导致平均值为 0。在这种情况下,-0.4*pi 与 0.6*pi 相同,因此另一个可能的答案是0.5*圆周率。同理这个均值有四种可能的答案,即:0、0.5*pi、pi、-0.5*pi。

我需要输出加权圆形平均值的函数,考虑到它总是选择角度之间可能的最短角距离的平均值,并输出落在 -0.5*pi 到 0.5*pi 范围内的值。对于一小组角度,使用一些 if 语句会很容易,但我正在处理几千个角度的数据集。

最佳答案

你可以计算出 mean of circular quantities通过将角度平均为笛卡尔平面中单位圆上的点(如果所有权重均为 1.0),然后转换回角度。

因为您使用的是(张量?)角度,其中相反的角度被视为相同,您应该修改此公式并计算角度的两倍的圆平均值:

mean = 0.5 * atan2(sum(i = 0...n, w[i] * sin(2*a[i])), 
sum(i = 0...n, w[i] * cos(2*a[i])))

如果您有很多角度,并且笛卡尔平均值靠近原点,您的角度可能不是很准确,甚至可能不确定。

权重 w[i] 被视为半径。这意味着如果您有两个值,(0°,权重 2) 和 (45°,权重 1),则平均值约为 13.3°。直接平均角度将产生 15°。)

所以这可能不是您正在寻找的解决方案,但它可能是一个起点。

编辑:另一种方法是调整角度,使差异在 (-PI/2, PI/2) 范围内,然后计算成对的平均值在类似 reduce 的加权插值中,到目前为止的平均值的权重也被累积。如果插值角度位于(-PI/2, PI/2)范围之外,则再次调整:

double angle_interpol(double a1, double w1, double a2, double w2)
{
double diff = a2 - a1;
double aa;

if (diff > PI/2) a1 += PI;
else if (diff < -PI/2) a1 -= PI;

aa = (w1 * a1 + w2 * a2) / (w1 + w2);

if (aa > PI/2) aa -= PI;
else if (aa < -PI/2) aa += PI;

return aa;
}

double angle_mean(double a[], double w[], int n)
{
int i;
double aa, ww;

if (n == 0) return 0;

aa = a[0];
ww = w[0];

for (i = 1; i < n; i++) {
aa = angle_interpol(aa, ww, a[i], w[i]);
ww += w[i];
}

return aa;
}

(对不起,这是 C,不是 Matlab。)

关于algorithm - 180° 偏移无关紧要时的角度加权平均值 (MATLAB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23429023/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com