Fortran Coder

标题: 这样的插值代码能不能再优化一下? [打印本页]

作者: 静待花开    时间: 2023-1-10 10:38
标题: 这样的插值代码能不能再优化一下?
我有一组数据放在 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] 纯文本查看 复制代码
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





作者: fcode    时间: 2023-1-10 10:43
数百行,乃至千行。

这个不算多,是我的话,就全部读在内存里。

如果你能确定CurTime是递增的,可以用一个变量来存储上一次插值的节点,每次都从上一次的插值节点向后搜索
作者: 静待花开    时间: 2023-1-10 16:24
fcode 发表于 2023-1-10 10:43
数百行,乃至千行。

这个不算多,是我的话,就全部读在内存里。

Time和Inflow这两个数组,我也是已经先从文本文件读进了内存,并不需要每次都读。
嗯嗯,CurTime确定是递增的。您这个建议我试试,感觉应该会不错。

作者: necrohan    时间: 2023-1-10 22:06
如果Time是整数,可以考虑把Time作为数组序号用,这样插值就不用查找了,Time数组也不需要了,但是缺失的数据需要另处理一下
作者: 静待花开    时间: 2023-1-14 18:57
necrohan 发表于 2023-1-10 22:06
如果Time是整数,可以考虑把Time作为数组序号用,这样插值就不用查找了,Time数组也不需要了,但是缺失的数 ...

Time是Real类型,非常感谢您的回复。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2