Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 如何填写缺失的NAN';s_Matlab_If Statement_Conditional Statements_User Defined Functions_Nan - Fatal编程技术网

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]