代码之家  ›  专栏  ›  技术社区  ›  Mary

重排分布函数Matlab

  •  0
  • Mary  · 技术社区  · 10 年前

    我有以下数据表示12个月期间的值:

    1. 0
    2. 253
    3. 168
    4. 323
    5. 556
    6. 470
    7. 225
    8. 445
    9. 98
    10. 114
    11. 381
    12. 187
    

    我怎样才能使这条线向前平滑?

    我需要的是,按顺序查看列表中任何高于平均值(268)的值都要在剩余的月份中均匀分布,但要尽可能平滑地生成一条直线。我需要从1月到12月办理手续。展望未来,我希望在接下来的几个月里清除所有多余的(峰值),以使分布尽可能均匀(从而首先填满低谷)。因此,问题是,在每一点上,确定该月的“超额”是多少,其次是如何在接下来的几个月中分配。

    我用过

    p = find(Diff>0);
    n = find(Diff<=0);
    POS = Diff(p,1);
    NEG = Diff(n,1)
    

    看看哪里存在与平均值的差额/超额,但不确定如何构造一个代码,通过先分配到分配的“槽”来向前分配。一个类比是,这些数字代表了收获量,我必须将收获量分配给人口。我如何在一年中重新分配新收获,以尽量减少供应过剩/供应不足?很明显,除非我储存了前几个月的收成,否则我不能将某个月没有收到的东西分发出去。 例如,我从1月开始,我发现我不能给2月到12月的月份提供任何信息,因此1月的值为0。2月份我有253个——我是向下调整253个还是全部放弃?如果是,多少钱?在3月到12月之间,我在哪里重新分配我修剪的多余部分?等等。。我如何做到这一点,以尽可能平滑(均匀)地分配? 对于任何月份,分配给该月份的新值都不能超过当前值。平滑前后12个月的总和必须相等。作为第一个位置,一月永远是0。

    3 回复  |  直到 10 年前
        1
  •  1
  •   nkjt    10 年前

    简单的版本,只是循环通过,如果下个月低于当前月,则向前传递值以使其相等。

    for n = 1:11
        if y(n)>y(n+1);
           y(n:n+1)=(y(n)+y(n+1))/2;
        end
    end
    

    enter image description here

        2
  •  0
  •   Rody Oldenhuis    10 年前

    我不太清楚你在问什么。。。这听起来有点拐弯抹角 how to fit a straight line to data 。如果是这种情况,请参见下文。否则:请再澄清一下你想要什么。提供玩具示例输入数据和预期输出数据。

    y = [ 0 253 168 323 556 470 225 445 98 114 381 187 ].';
    x = (0:numel(y)-1).';
    
    A = [ones(size(x)) x];
    
    plot(...
        x,       y, 'b.',...
        x, A*(A\y), 'r')
    xlabel('Month'), ylabel('Data')
    legend('original data', 'fit')
    

    enter image description here

        3
  •  0
  •   ben    10 年前

    我也没有得到你想要的东西,也许是这样简单的东西?

    year= [0 253 168 323 556 470 225 445 98 114 381 187];
    m= mean(year);
    total_before = sum(year)
    linear_year = linspace(0,m*2,12);
    toal_after= sum(linear_year)
    

    这给你一条线,总和保持不变,这条线非常平滑。。。