求助——数据处理问题

 

  大家好,本人算法菜鸟一枚,有个处理数据的问题想了好几天,也初步写了一点代码,总达不到理想的效果,希望高手们指点。


 

  背景与数据细节这里先略过(考虑到公司数据的保密性与表达的无必要性)。

  遇到的问题可以简单地归结到两个公式上面:

  1、K= A1*Px

  2、K= It+(1-Jt)*Kt-1

  公式中变量及要求说明:

  1、目前收集的数据是从1978年到2012年,计算时需要选定某一年为基年,然后以该基年的数据为起点开始往下计算某些属性值。如基年选定1978,则以1978年的数据为起点,一直计算到2012,同理,若基年为1995,则以1995年的数据为起点,一直计算到2012。

  2、上面提到以基年为起点能算到一些属性值,如A, I,易知这两个属性变量均为向量,元素个数为最新数据年份-基年+1,如基年为1995,则个数为2012-1995+1 = 18,It表示第t年的I值,t范围[1,18]。但还有些属性值需要通过两个不定因素的迭代计算得到,如K:K0和A1,P有关,这里的P为第一个不定因素,变化范围[4.0,5.5],亦是迭代的第一层。

  写过代码的朋友都清楚,这一层迭代只要一个for循环即可完成,这里给出Matlab代码,基年假定为1995。

 

1 for Px = 4.0:0.1:5.5
2      K(1,1) = A(1,1)*Px;  % Matlab中(i,j)表示取矩阵或向量的第i行,第j列元素,这里的变量均为列向量
3      for t = 2:18         % 后面年份K值的计算
4          K(t,1) = I(t,1)+(1-J(t,1))*K(t-1,1);
    end
5 end

 

  若在Px这个迭代过程中加入最优解评判标准,则可知对于某一个基年,Px最优取值只有一个(假定评判时没有相同的最优结果),也可以说Px参数只针对基年,和后面年份无直接关系。如1995对应4.5,1998对应4.7,这个没有什么难处,也很好理解。


  问题就在于第二个不定因素:J。在计算最优解过程中,J参数和基年无关,但和后面年份相关且每年对应的J值均在范围[0.1,0.23]。

  说到这,本人的本能反应是在第一层迭代中加入J的多层迭代,如基年为2010,则还需加入2011,2012这两年的J值迭代过程。代码如下:

 

for Px = 4.0:0.1:5.5
     K(1,1) = A(1,1)*Px;  % Matlab中(i,j)表示取矩阵或向量的第i行,第j列元素,这里的变量均为列向量
     for J1 = 0.1:0.001:0.23
         for J2 = 0.1:0.001:0.23
            J = [1,J1,J2]';      % 符号'表示行向量转为列向量,第一个元素无效,只做占位用,因为需从基年的下一年开始计算
            for t = 2:3          % 后面年份K值的计算
                K(t,1) = I(t,1)+(1-J(t,1))*K(t-1,1);
                % 最优解评判过程在此处
            end
        end
    end
end        

 

  表面上看,问题解决了,至少在不管最优解能否满足实际需求的前提下。但是仔细一想,忽略了至关重要的一点——最新年份与基年的变动性。看下面列出的几种可能的情况就能知道问题所在:

  1、上述代码中的例子,基年为2010,最新年份为2012,则迭代嵌套为两层;

  2、最初提到的基年为1978,最新年份为2012,需35层;

  3、后面提到的基年1995,最新年份为2012,需18层;

  4、用户提供的数据也许最新年份为2013或2014等,同样,基年选择1999或2005等;面对这种最新年份与基年都不确定的情况,不定因素J的迭代过程该如何实现?

  本人的能力确实想不出好的方法,目前能做到的只是能确定迭代的次数,如最新年份为2015,基年选取为2000,则迭代嵌套为2015-2000 = 15层。

  提醒一点,确定了层数之后不管其大小如何,是可以实现,如30层就写30个for循环。随着最新年份与基年的变动,层数也跟着变,但是怎么让实现过程也相应地等价层数呢?

  换句话说,上面的疑问即是:

  1、若层数为2,则为两个for循环;

  2、若层数为10,则对应十个for循环;

  3、但是数据的最新年份由统计时间或要求决定,基年选择也不能事先确定,怎么做到:根据用户的数据与基年的选择情况,实现相应的J迭代?

  

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值