Algorithm 180°时角度的加权平均值;移位不重要(MATLAB)

Algorithm 180°时角度的加权平均值;移位不重要(MATLAB),algorithm,matlab,math,Algorithm,Matlab,Math,我试图计算一大组角度的加权平均角度(范围:-0.5*pi到0.5*pi)。通常情况下,这不会是一个问题,因为在前面的问题中已经解释了很多次,但在我的情况下,我试图计算pi(180°)偏移不重要时的平均角度 例如,通过任何常规方法,循环平均值-0.4*pi和0.4*pi将导致平均值为0。在本例中,-0.4*pi与0.6*pi相同,因此另一个可能的答案是0.5*pi。根据同样的推理,这个平均值有四个可能的答案,即:0,0.5*pi,pi,-0.5*pi 我需要函数输出加权循环平均值,考虑到它总是在角

我试图计算一大组角度的加权平均角度(范围:-0.5*pi到0.5*pi)。通常情况下,这不会是一个问题,因为在前面的问题中已经解释了很多次,但在我的情况下,我试图计算pi(180°)偏移不重要时的平均角度

例如,通过任何常规方法,循环平均值-0.4*pi和0.4*pi将导致平均值为0。在本例中,-0.4*pi与0.6*pi相同,因此另一个可能的答案是0.5*pi。根据同样的推理,这个平均值有四个可能的答案,即:0,0.5*pi,pi,-0.5*pi

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

可以通过在笛卡尔平面中将角度平均为单位圆上的点(如果所有权重均为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;
}
双角度国际刑警组织(双a1、双w1、双a2、双w2)
{
双差=a2-a1;
双aa;
如果(diff>PI/2)a1+=PI;
如果(差值<-PI/2)a1-=PI;
aa=(w1*a1+w2*a2)/(w1+w2);
如果(aa>PI/2)aa-=PI;
如果(aa<-PI/2)aa+=PI;
返回aa;
}
双角平均值(双a[],双w[],整数n)
{
int i;
双aa,ww;
如果(n==0)返回0;
aa=a[0];
ww=w[0];
对于(i=1;i
(很抱歉,这是C,不是Matlab。)

您可以通过将笛卡尔平面上单位圆上的点(如果所有权重均为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;
}
双角度国际刑警组织(双a1、双w1、双a2、双w2)
{
双差=a2-a1;
双aa;
如果(diff>PI/2)a1+=PI;
如果(差值<-PI/2)a1-=PI;
aa=(w1*a1+w2*a2)/(w1+w2);
如果(aa>PI/2)aa-=PI;
如果(aa<-PI/2)aa+=PI;
返回aa;
}
双角平均值(双a[],双w[],整数n)
{
int i;
双aa,ww;
如果(n==0)返回0;
aa=a[0];
ww=w[0];
对于(i=1;i
(很抱歉,这是C,不是Matlab。)

您可以通过将笛卡尔平面上单位圆上的点(如果所有权重均为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;
}
双角度国际刑警组织(双a1、双w1、双a2、双w2)
{
双差=a2-a1;
双aa;
如果(diff>PI/2)a1+=PI;
否则我