【MATLAB第24期】源码分享| 基于MATLAB的五种插值方法合集(线性、三次、三次样条、最邻近、分段三次Hermite),解决多变量样本空值插值,以及零值插值
免费提供试用版代码,可自行运行计算结果。
1.数据要求
(1)数据均为数值格式。
(2)每行为不同变量的值。
(2)首尾数据得有值,不能空缺。
2.插值方法
(1)线性插值
(2)三次插值
(3)三次样条插值
(4)最邻近插值
(5)分段三次Hermite插值
3.插值思路
(1)提取非零或者非空对应的数据进行插值
(2)找到对应非零或者非空的行以及列
(3)使用五种方法,用for循环分别对提取后的残缺合集进行插值
(4)对插值结果赋值为datanew1~5
(5)将插值的结果替换原来的非零或者非空数据
(6)判断插值结果是否为负
4.插值数据
(1)空值插值
(2)零值插值
5.插值结果
插值结果不一一举例,选取线性插值结果进行展示。
(1)空值插值
(2)零值插值
6.主程序代码展示(部分)
(1)空值插值
clc,clear; data=xlsread('randNaNExample.xlsx','Sheet1'); %提取数据分析1数据 data1=data(:,1:end);% [M,p1,p2,p3,p4,p5] = mynan(data); finaldata1=data1;% 线性插值结果 finaldata2=data1;% 三次插值结果 finaldata3=data1;% 三次样条插值法结果 finaldata4=data1;% 最邻近插值法结果 finaldata5=data1;% 分段三次Hermite插值预测结果 %判断p有没有负数 for i=1:size(M,1) cc1{i,1}=find(p1{i,1}<0); %cc 变量里 如果有值,说明存在负数 end for i=1:size(M,1) cc2{i,1}=find(p2{i,1}<0); %cc 变量里 如果有值,说明存在负数 end for i=1:size(M,1) cc3{i,1}=find(p3{i,1}<0); %cc 变量里 如果有值,说明存在负数 end for i=1:size(M,1) cc4{i,1}=find(p4{i,1}<0); %cc 变量里 如果有值,说明存在负数 end for i=1:size(M,1) cc5{i,1}=find(p5{i,1}<0); %cc 变量里 如果有值,说明存在负数 end datanew1=cell2mat(p1);% 还原p矩阵 线性插值 datanew2=cell2mat(p2);% 还原p矩阵 三次插值 datanew3=cell2mat(p3);% 还原p矩阵 三次样条插值法 datanew4=cell2mat(p4);% 还原p矩阵 最邻近插值法 datanew5=cell2mat(p5);% 还原p矩阵 分段三次Hermite插值预测 finaldata1(M,:)=datanew1;% data原来的数据 有空值的样本都替换成新插值的样本 finaldata2(M,:)=datanew2;% data原来的数据 有空值的样本都替换成新插值的样本 finaldata3(M,:)=datanew3;% data原来的数据 有空值的样本都替换成新插值的样本 finaldata4(M,:)=datanew4;% data原来的数据 有空值的样本都替换成新插值的样本 finaldata5(M,:)=datanew5;% data原来的数据 有空值的样本都替换成新插值的样本
(2)零值插值
clc,clear; data=xlsread('rand0Example.xlsx','Sheet1'); %提取数据分析1数据 data1=data(:,1:end);% [M,p1,p2,p3,p4,p5] = myzero(data); finaldata1=data1;% 线性插值结果 finaldata2=data1;% 三次插值结果 finaldata3=data1;% 三次样条插值法结果 finaldata4=data1;% 最邻近插值法结果 finaldata5=data1;% 分段三次Hermite插值预测结果 %判断p有没有负数 for i=1:size(M,1) cc1{i,1}=find(p1{i,1}<0); %cc 变量里 如果有值,说明存在负数 end for i=1:size(M,1) cc2{i,1}=find(p2{i,1}<0); %cc 变量里 如果有值,说明存在负数 end for i=1:size(M,1) cc3{i,1}=find(p3{i,1}<0); %cc 变量里 如果有值,说明存在负数 end for i=1:size(M,1) cc4{i,1}=find(p4{i,1}<0); %cc 变量里 如果有值,说明存在负数 end for i=1:size(M,1) cc5{i,1}=find(p5{i,1}<0); %cc 变量里 如果有值,说明存在负数 end datanew1=cell2mat(p1);% 还原p矩阵 线性插值 datanew2=cell2mat(p2);% 还原p矩阵 三次插值 datanew3=cell2mat(p3);% 还原p矩阵 三次样条插值法 datanew4=cell2mat(p4);% 还原p矩阵 最邻近插值法 datanew5=cell2mat(p5);% 还原p矩阵 分段三次Hermite插值预测 finaldata1(M,:)=datanew1;% data原来的数据 有空值的样本都替换成新插值的样本 finaldata2(M,:)=datanew2;% data原来的数据 有空值的样本都替换成新插值的样本 finaldata3(M,:)=datanew3;% data原来的数据 有空值的样本都替换成新插值的样本 finaldata4(M,:)=datanew4;% data原来的数据 有空值的样本都替换成新插值的样本 finaldata5(M,:)=datanew5;% data原来的数据 有空值的样本都替换成新插值的样本
7.代码获取
试用版代码以及案例数据将基本免费提供。
后台私聊“第24期试用版”获取试用版下载链接
后台私聊“第24期完整版”获取完整版下载链接