C# 线性插值

C# 线性插值

  1. 对于给定起点、终点和插值点数目,生成线性插值后的数组
  2. 对于缺失部分值得数据序列,进行线性插值,插值填补该序列(如有一组数据中间缺失了一部分,用其起点和终点进行线性插值)

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;
        }
  • 0
    点赞
  • 7
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

Mahmut0205

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值