【华为机试047】线性插值

该博客讨论了在信号测量中遇到的测量编号不连续和重复问题,提出了一阶线性插值方法来处理丢失的测量结果。通过计算相邻测量值之间的差值比例,对丢失的测量值进行估算。例如,当测量编号为4的值为4,测量编号为7的值为10时,插值得到测量编号为5的值为6,测量编号为6的值为8。博客还提醒在实现过程中要注意避免直接修改原始输入数据,并区分插值、无需插值和需要跳过的不同情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

信号测量的结果包括测量编号和测量值。存在信号测量结果丢弃及测量结果重复的情况。

  

  1.测量编号不连续的情况,认为是测量结果丢弃。对应测量结果丢弃的情况,需要进行插值操作以更准确的评估信号。

  采用简化的一阶插值方法,由丢失的测量结果两头的测量值算出两者中间的丢失值。

  假设第M个测量结果的测量值为A,第N个测量结果的测量值为B。则需要进行(N-M-1)个测量结果的插值处理。进行一阶线性插值估计的第N+i个测量结果的测量值为A+( (B-A)/(N-M) )*i  (注:N的编号比M大。)

  例如:只有测量编号为4的测量结果和测量编号为7的测量结果,测量值分别为4和10

        则需要补充测量编号为5和6的测量结果。

         其中测量编号为5的测量值=4 + ((10-4)/(7-4))*1 = 6

         其中测量编号为6的测量值=4 + ((10-4)/(7-4))*2 = 8

  

      2.测量编号相同,则认为测量结果重复,需要对丢弃后来出现的测量结果。

Java实现:

import java.util.Scanner;
import java.util.ArrayList;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (sc.hasNext()) {
            int n = sc.nextInt();
            int m = sc.nextInt();
            int[][] data = new int[n][2];
            for (int i = 0; i < n; i++) {
                data[i][0] = sc.nextInt();
                data[i][1] = sc.nextInt();
            }

            ArrayList<String> list = new ArrayList<String>();

            int KEY = data[0][0];
            int VALUE = data[0][1];
            list.add(KEY + " " + VALUE);
            for (int i = 1; i <= n - 1; i++) {
                int diff = data[i][0] - KEY - 1;
                if (diff > 0) {//需要进行插值
                    for (int j = 1; j <= diff; j++) {
                        int key = KEY + j;
                        int value = VALUE + (data[i][1] - VALUE) / (data[i][0] - KEY) * j;
                        list.add(key + " " + value);
                    }
                    list.add(data[i][0] + " " + data[i][1]);
                    KEY = data[i][0];
                    VALUE = data[i][1];
                //两个键相等则直接跳过,此时KEY,VVALUE保存的还是上一个值
                } else if (diff == -1)
                    continue;
                else {//不需要插值
                    list.add(data[i][0] + " " + data[i][1]);
                    KEY = data[i][0];
                    VALUE = data[i][1];
                }
            }
            for (String s : list)
                System.out.println(s);
        }
    }
}

知识点:

  • 新建一个ArrayList进行输出数据的构建,而不是在原始输入数组中增删
  • 分为三种情况,需要插值,不需要插值, 需要跳过
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值