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;
        }
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值