Matlab 如何填写缺失的NAN';s
我想将Matlab 如何填写缺失的NAN';s,matlab,if-statement,conditional-statements,user-defined-functions,nan,Matlab,If Statement,Conditional Statements,User Defined Functions,Nan,我想将[1 nan 1 2 nan 3 nan 4 nan 5]更改为[1 1.5 1 2 2 3 3.5 4 4 5]。如果有一个NAN,我希望NAN中填入前后数字的平均值。如果有多个NAN。 我想用最接近的数字填写NAN 到目前为止,我只有找到单个NAN的代码: max_x = x(:, 2); min_x = x(:, 3); for jj = 1:length(max_x) for kk = 1:length(min_x) if isnan(max_x(jj))
[1 nan 1 2 nan 3 nan 4 nan 5]
更改为[1 1.5 1 2 2 3 3.5 4 4 5]
。如果有一个NAN,我希望NAN中填入前后数字的平均值。如果有多个NAN。
我想用最接近的数字填写NAN
到目前为止,我只有找到单个NAN的代码:
max_x = x(:, 2);
min_x = x(:, 3);
for jj = 1:length(max_x)
for kk = 1:length(min_x)
if isnan(max_x(jj))
max_x (jj) = ((max_x(jj-1)+max_x(jj+1))/2);
elseif isnan (min_x(kk))
min_x (kk) = ((min_x(kk-1)+min_x(kk+1))/2);
end
end
end
我如何填写非单身的NAN
非常感谢。这个问题的标题也几乎就是答案-使用填充缺少的值 R2016b中引入了此功能
使用
interp1
和isnan
可以实现相同的逻辑
idx = ~isnan( A );
x = 1:numel(A);
B = interp1( x(idx), A(idx), x, 'linear', 'extrap' );
请注意,这里的外推给出了输入向量两端的
NaN
值稍微不同的行为。这个问题的标题也几乎是答案-使用填充缺失值
R2016b中引入了此功能
使用
interp1
和isnan
可以实现相同的逻辑
idx = ~isnan( A );
x = 1:numel(A);
B = interp1( x(idx), A(idx), x, 'linear', 'extrap' );
注意,这里的外推给出了输入向量两端的NaN
值的略微不同的行为。示例代码:
% To paste in main .m file
A = [1 nan 1 2 2 nan nan 3 nan 4 nan nan 5]; % Input array
[A] = new_array(A) % Function to get a new array
% To paste in individual .m file as function
function [x]= new_array(x)
is_nan_ar = isnan(x); % Getting 0/1 array of nan elements
array_l = length(x); % Getting length of x array (just to do it only once)
for k = 1:array_l % Checking every element of input array whether it's...
if (k==1) && (is_nan_ar(k)==1) % First element and nan
kk = 2; % Initial index for searching the nearest non-nan element
while (isnan(is_nan_ar(kk))==1) % Checking elements for being nan
kk=kk+1; % Increasing index while we're searching
end
x(k) = x(kk); % Writing down the first not nan element
elseif (k==array_l) && (is_nan_ar(k)==1) % The same search for the last
kk = array_l-1; % Intial index
while (isnan(is_nan_ar(kk))==1) % Reversed search for not not nan
kk=kk-1;
end
x(k) = x(kk); % Writing down what we found
elseif (is_nan_ar(k)==1) % When we're checking not the first and not the last
s_r = 1; % Search range (1 element to the left/right)
while (is_nan_ar(k-s_r)==1) && (is_nan_ar(k+s_r)==1) %Looking for not nan
s_r = s_r+1; % Increasment of the range if didn't find
end
if (is_nan_ar(k-s_r)==0) && (is_nan_ar(k+s_r)==0) % Two non-nans are near
x(k) = (x(k-s_r)+x(k+s_r))/2;
elseif (is_nan_ar(k-s_r)==0) % Only one non-nan on the left
x(k) = x(k-s_r);
else % Only one non-nan on the right
x(k) = x(k+s_r);
end
end
end
end
示例代码:
% To paste in main .m file
A = [1 nan 1 2 2 nan nan 3 nan 4 nan nan 5]; % Input array
[A] = new_array(A) % Function to get a new array
% To paste in individual .m file as function
function [x]= new_array(x)
is_nan_ar = isnan(x); % Getting 0/1 array of nan elements
array_l = length(x); % Getting length of x array (just to do it only once)
for k = 1:array_l % Checking every element of input array whether it's...
if (k==1) && (is_nan_ar(k)==1) % First element and nan
kk = 2; % Initial index for searching the nearest non-nan element
while (isnan(is_nan_ar(kk))==1) % Checking elements for being nan
kk=kk+1; % Increasing index while we're searching
end
x(k) = x(kk); % Writing down the first not nan element
elseif (k==array_l) && (is_nan_ar(k)==1) % The same search for the last
kk = array_l-1; % Intial index
while (isnan(is_nan_ar(kk))==1) % Reversed search for not not nan
kk=kk-1;
end
x(k) = x(kk); % Writing down what we found
elseif (is_nan_ar(k)==1) % When we're checking not the first and not the last
s_r = 1; % Search range (1 element to the left/right)
while (is_nan_ar(k-s_r)==1) && (is_nan_ar(k+s_r)==1) %Looking for not nan
s_r = s_r+1; % Increasment of the range if didn't find
end
if (is_nan_ar(k-s_r)==0) && (is_nan_ar(k+s_r)==0) % Two non-nans are near
x(k) = (x(k-s_r)+x(k+s_r))/2;
elseif (is_nan_ar(k-s_r)==0) % Only one non-nan on the left
x(k) = x(k-s_r);
else % Only one non-nan on the right
x(k) = x(k+s_r);
end
end
end
end
两个值之间是否存在2个以上的NAN?如果是,例如[2 nan 3]会发生什么情况?是[2 2 2 3 3]还是[2 2 3 3]?您的示例在第一个nan中是否有一点错误?1.5不是1和1的平均值,我不明白第一个
NaN
在两个1
之间时如何变成1.5
?这是打字错误吗?这不是你的代码会输出什么。哦,是的,我输入了一个错误,应该是[1 nan 2 nan 2 nan 3 nan 4 nan nan 5],所以1和2之间的平均值是1.5是的,值之间可以有2个以上的nan,并且可以连续超过10个nan。如果是这样的话,[2 nan 3]会变成[2 2.5 3]两个值之间是否有超过2 nan的值?如果是,例如[2 nan 3]会发生什么情况?是[2 2 2 3 3]还是[2 2 3 3]?您的示例在第一个nan中是否有一点错误?1.5不是1和1的平均值,我不明白第一个NaN
在两个1
之间时如何变成1.5
?这是打字错误吗?这不是你的代码会输出什么。哦,是的,我输入了一个错误,应该是[1 nan 2 nan 2 nan 3 nan 4 nan nan 5],所以1和2之间的平均值是1.5是的,值之间可以有2个以上的nan,并且可以连续超过10个nan。如果是这样,那么[2 nan 3]会变成[2.5 3]