Fortran Coder

查看: 2860|回复: 4
打印 上一主题 下一主题

[求助] 这样的插值代码能不能再优化一下?

[复制链接]

80

帖子

26

主题

0

精华

专家

F 币
280 元
贡献
150 点
跳转到指定楼层
楼主
发表于 2023-1-10 10:38:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我有一组数据放在 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




分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1641 元
贡献
709 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 2023-1-10 10:43:42 | 只看该作者
数百行,乃至千行。

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

如果你能确定CurTime是递增的,可以用一个变量来存储上一次插值的节点,每次都从上一次的插值节点向后搜索

80

帖子

26

主题

0

精华

专家

F 币
280 元
贡献
150 点
板凳
 楼主| 发表于 2023-1-10 16:24:20 | 只看该作者
fcode 发表于 2023-1-10 10:43
数百行,乃至千行。

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

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

250

帖子

2

主题

0

精华

宗师

F 币
1731 元
贡献
872 点

规矩勋章

地板
发表于 2023-1-10 22:06:15 | 只看该作者
如果Time是整数,可以考虑把Time作为数组序号用,这样插值就不用查找了,Time数组也不需要了,但是缺失的数据需要另处理一下

80

帖子

26

主题

0

精华

专家

F 币
280 元
贡献
150 点
5#
 楼主| 发表于 2023-1-14 18:57:31 | 只看该作者
necrohan 发表于 2023-1-10 22:06
如果Time是整数,可以考虑把Time作为数组序号用,这样插值就不用查找了,Time数组也不需要了,但是缺失的数 ...

Time是Real类型,非常感谢您的回复。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-12-24 08:54

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表