栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Java 线性插值填充缺失点

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java 线性插值填充缺失点

问题描述

已知时间戳与对应的值,需要根据时间戳找到缺失的点,然后进行值的填充。

例如:

timestampvalue
11.0
22.0
//
44.0
55.0
//
//
88.0
99.0

填充其中三个缺失的地方分别:

timestampvalue
/3.0
/6.0
/7.0
源码

    org.apache.commons
    commons-math3
    3.6.1

引入相应的依赖包

import java.util.linkedList;
import java.util.List;
import org.apache.commons.math3.analysis.interpolation.LinearInterpolator;
import org.apache.commons.math3.analysis.polynomials.PolynomialSplineFunction;

缺失值填充的源码:

public static List insertMissingByTimestamps(List timestamps,
                                                     List values,
                                                     Long interval) {
    // 检查问题
    if (timestamps == null || values == null ||
            timestamps.size() == 0 || values.size() == 0) {
        return null;
    }
    
    // 准备好线性插值
    LinearInterpolator interp = new LinearInterpolator();
    double[] timestampsAry = timestamps.stream().mapToDouble(d -> d).toArray();
    double[] valuesAry = values.stream().mapToDouble(d -> d).toArray();
    PolynomialSplineFunction insertMissingFunc = interp.interpolate(timestampsAry, valuesAry);

    // 计算正常情况下有多少个点
    final int normalSize = countMissingPoints(timestamps, interval);
    long current = timestamps.get(0);
    List target = new linkedList<>();

    // 填充
    for (int i=0; i 
测试用例 
double[] x = { 1,  3, 4,   7, 8, 9, 10};
double[] y = { 1,  3, 4,   7, 8, 9, 10};

LinearInterpolator interp = new LinearInterpolator();
PolynomialSplineFunction f = interp.interpolate(x, y);

System.out.println("Piecewise functions:");
Arrays.stream(f.getPolynomials()).forEach(System.out::println);

double value = f.value(5);
double value2 = f.value(6);

System.out.println("x = 3, y = " + f.value(3));
System.out.println("x = 6, y = " + f.value(6));
System.out.println("x = 7, y = " + f.value(7));

测试输出内容:

1 + x
2 + x
4 + x
5 + x
8 + x
x = 3, y = 3.0
x = 6, y = 6.0
x = 7, y = 7.0

注意:如果是边界外的是不能计算的。比如这个题目中不能计算 f.value(10) 。

总结

很简单的东西,但是找了很久才找到这个库文件以及使用例子。总结一下,希望能够帮到需要的小伙伴们。

Smileyan
2021.11.5 17:30

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/424887.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号