概述
任务描述:站点降水有缺省值,所以需要线性插补空白数据
写成了函数,可以直接调用
第一种
%% 本函数用于线性插补缺省值
function A = default_linear_interpo(A,B)
%A是时间序列
%B是缺省值,站点的缺省值是32700
if A(1) == B
A(1) = 0;
%如果首位缺省,则赋值零
end
i = 2;
while i<=length(A)
if A(i) == B
%发现缺省值则向后搜索找到非缺省值
for j = i+1:length(A)
if A(j) == B
continue
%仍为缺省值则跳过
else
break
%找到非缺省值就结束循环,j记录了非缺省值的位置
end
end
slope = (A(j)-A(i-1))/(j-i+1);
%线性插补的斜率
for k = i:j-1
A(k) = A(i-1)+(k-i+1)*slope;
%根据斜率插补i到j-1
end
i = j-1;
%因为i到j-1都已经插补好了,所以i直接到j-1,避免重复插补
end
i = i+1;
end
第二种
%% 本函数用于缺失数据的线性插补
%% 修改时间 2021/10/26
function A = f_Linear_interpolate(A)
%A是swe的一维时间序列,缺失数据需标记为nan
%% 如果首位缺省,则向下搜索两个观测值,线性延长
loc = [0,0];
%记录观测值出现位置
if isnan(A(1))
%确定缺省值位置
B = ~isnan(A);
for i = 1:length(B)
if
loc(1) == 0 && sum(B(1:i)) == 1
loc(1) = i;
%记录第一个观测值的位置
end
if sum(B(1:i)) == 2
%说明出现了两个观测值
loc(2) = i;
%记录第二个观测值的位置
break
end
end
%插值
slope = (A(loc(2))-A(loc(1)))/(loc(2)-loc(1));
%线性插值的梯度
for i = 1:loc(2)
if ismember(i,loc)
continue
else
A(i) = A(loc(2))-(loc(2)-i)*slope;
if A(i)<0
A(i) =0;
%避免负值
end
end
end
end
%% 如果末位缺省,则向上搜索两个观测值,线性延长
loc = [0,0];
%记录观测值出现位置
if isnan(A(end))
%确定缺省值位置
B = ~isnan(A);
for i = length(B):-1:1
if
loc(2) == 0 && sum(B(i:end)) == 1
loc(2) = i;
%记录倒序第一个观测值的位置
end
if sum(B(i:end)) == 2
%说明出现了两个观测值
loc(1) = i;
%记录倒序第二个观测值的位置
break
end
end
%插值
slope = (A(loc(2))-A(loc(1)))/(loc(2)-loc(1));
%线性插值的梯度
for i = length(A):-1:loc(1)
if ismember(i,loc)
continue
else
A(i) = A(loc(1))+(i-loc(1))*slope;
if A(i)<0
A(i) =0;
%避免负值
end
end
end
end
%% 缺省值在中间,则向上向下各搜索最近实测值,进行线性插值
i = 2;
while i<=length(A)
if isnan(A(i))
%发现缺省值则向后搜索找到非缺省值
for j = i+1:length(A)
if isnan(A(j))
continue
%仍为缺省值则跳过
else
break
%找到非缺省值就结束循环,j记录了非缺省值的位置
end
end
slope = (A(j)-A(i-1))/(j-i+1);
%线性插补的斜率
for k = i:j-1
A(k) = A(i-1)+(k-i+1)*slope;
%根据斜率插补i到j-1
end
i = j-1;
%因为i到j-1都已经插补好了,所以i直接到j-1,避免重复插补
end
i = i+1;
end
end
最后
以上就是明理未来为你收集整理的MATLAB 线性插补缺省值的全部内容,希望文章能够帮你解决MATLAB 线性插补缺省值所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复