C# 线性插值
- 对于给定起点、终点和插值点数目,生成线性插值后的数组
- 对于缺失部分值得数据序列,进行线性插值,插值填补该序列(如有一组数据中间缺失了一部分,用其起点和终点进行线性插值)
1)对于给定起点、终点和插值点数目,生成线性插值后的数组
/// <summary>
/// 线性插值(返回插值后的数组,包括起止点)
/// </summary>
/// <param name="d1">起始值</param>
/// <param name="d2">终止值</param>
/// <param name="num">插值后数组插值后长度(包括起止点)</param>
/// <returns>插值后结果</returns>
public static double[] linearInter(double d1, double d2, int num)
{
double[] data = new double[num];
double dt = (d2 - d1) / (num - 1);
for (int i = 0; i < num; i++)
{
data[i] = d1 + (i * dt);
}
return data;
}
2)对于缺失部分值得数据序列,进行线性插值,插值填补该序列
主要思路是:
1.把待插值的数据读入一个数组A中,把缺失部分标记为NaN (数组A就是下面函数的输入参数)。
2.遍历数组A,通过空值判断需要插值的部分的起点和终点
3.通过上面的方法对该部分插值(获得该部分插值后的数组),并根据记录的起点索引填补空值
public static double[] linearInter(double[] data)
{
double[] result = (double[])data.Clone(); //克隆是为了不破坏原来的数组
List<int> startIndex = new List<int>(); //记录起点
List<int> endIndex = new List<int>(); //记录终点
for (int i = 0; i < data.Length; i++)
{
if (i != (data.Length - 1) && !double.IsNaN(data[i]) && double.IsNaN(data[i + 1])) //该值有效,而后一个值无效
{
startIndex.Add(i);
}
if (i > 0 && !double.IsNaN(data[i]) && double.IsNaN(data[i - 1])) //该值有效,而前一个值无效
{
endIndex.Add(i);
}
}
for(int i = 0; i < startIndex.Count; i++) //对每一段进行插值
{
double startData = data[startIndex[i]];
double endData = data[endIndex[i]];
int len = endIndex[i] - startIndex[i] + 1;
double[] interResult = linearInter(startData, endData, len);
for(int j = startIndex[i]; j < endIndex[i]; j++)
{
result[j] = interResult[j - startIndex[i]]; //把该段插值结果填补到目标数组中
}
}
return result;
}
/// <summary>
/// 线性插值(返回插值后的数组,包括起止点)
/// </summary>
/// <param name="d1">起始值</param>
/// <param name="d2">终止值</param>
/// <param name="num">插值后数组插值后长度(包括起止点)</param>
/// <returns>插值后结果</returns>
public static double[] linearInter(double d1, double d2, int num)
{
double[] data = new double[num];
double dt = (d2 - d1) / (num - 1);
for (int i = 0; i < num; i++)
{
data[i] = d1 + (i * dt);
}
return data;
}
830

被折叠的 条评论
为什么被折叠?



