| 我有一组数据放在 data.txt中,如下所示,共5行。第1列数据代表时刻,单位是秒。这列数据并不规则,它们并不等差,存储在 Time(:) 数组中。第二列数据是对应时刻的流量值,存储在 Inflow(:) 数组中。------------- 0        10
 1        15
 3        20
 4        22
 5       15
 -------------
 下面贴出代码。代码并不完整,只是插值的核心部分。代码中的CurTime是由其它子程序计算得到,它也是由0.0开始,逐渐增加,但每次增加的大小并不确定,会变化。下面代码中没有写出CurTime的变化,大家可以把它当成一个已知的值。下面代码就想线性插值得到 CurTime 这 个时刻的 Inflow 值。CurTime在不断变大,每变一次,都要用下面这个代码插值一次得到新的Inflow。
 感觉下面自己的这个算法有点笨,算法每次都要从data.txt中的第1行开始读,并找到Curtime位于哪两个Time之间,然后做线性插值。感觉这样的效率有点低。因为随着CurTime的增大,它需要用到的两行插值数据,越来越在data.txt的后面,但算法还是要逐个比较 data.txt 前面的数据,有点浪费时间。因为上面的data.txt只是我举的一个例子,仅为了示意。实际程序中这个data.txt有数百行,乃至千行。自己也没有找到更好的方法,大家有没有好的优化建议。欢迎指教。
 
 [Fortran] syntaxhighlighter_viewsource syntaxhighlighter_copycode program main
    implicit none
    integer :: Time(5), Inflow(5)
    integer :: j
    real    :: CurTime, InflowNow
    Time   = (/ 0,  1,  3,  4,  8  /)
    Inflow = (/ 10, 15, 20, 22, 15 /)
    Do j = 1, 5
       IF(CurTime == Time(j)) Then
          InflowNow = Inflow(j)
            Exit
       Else IF(CurTime < Time(j)) Then
            InflowNow = Inflow(j-1) + (CurTime - Time(j-1))*(Inflow(j) - Inflow(j-1)) / (Time(j) - Time(j-1))
          Exit
       End IF
    End Do
end
 
 
 
 |