题目描述
信号测量的结果包括测量编号和测量值。存在信号测量结果丢弃及测量结果重复的情况。
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 = 82.测量编号相同
则认为测量结果重复,需要对丢弃后来出现的测量结果。
输入描述:
输入说明
1 输入两个整数m, n (事实上这里的n,一点用都没)
2 输入m个数据组输出描述:
输出整理后的结果示例1
输入
2 3
4 5 //前一个数据是位置,后一个是值
5 7
输出
4 5
5 7
代码实现
思路:其实题目有点描述不清,主要分为
1.重复则后来的数据去掉
2.不连续则插值
package cn.c_shuang.demo46;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
/**
* 线性插值
* @author Cshuang
*
*/
public class Main {
public static void main(String[] args){
Scanner in = new Scanner(System.in);
while(in.hasNext()){
int m=in.nextInt();
int n=in.nextInt();//没什么用
int[][]data=new int[m][2];
for (int i = 0; i < m; i++) {
data[i][0]=in.nextInt();
data[i][1]=in.nextInt();
}
int KEY=data[0][0];
int VALUE=data[0][1];
List<String>list=new ArrayList<String>();
list.add(KEY+" "+VALUE);
for (int i = 1; i <m; i++) {
int diff=data[i][0]-data[i-1][0];//相邻的差值
if(diff>1){//不连续的情况
for (int j = 1; j <=diff-1; j++) {
////编号,这里必须用KEY,而不能用data[i-1][0],是因为可能上一个点是连续点,被跳过
int key=KEY+j;
int value=VALUE+(data[i][1]-VALUE)/(data[i][0]-KEY)*j;
list.add(key+" "+value);
}
}else if(diff==0)//连续的点不做处理
continue;
list.add(data[i][0]+" "+data[i][1]);
KEY=data[i][0];
VALUE=data[i][1];
}
for (String s : list) {
System.out.println(s);
}
}
in.close();
}
}