MATLAB:如何从矩阵中有效地去除NaN元素

时间:2011-03-05 08:40:23

标签: matlab

我正在寻找一种方法在MATLAB中有效地从矩阵中删除NaN数(即不使用for循环)

我将提供一个简单的例子来说明我想要实现的目标:

说我有一个矩阵M:

          3.00          1.00
          1.00          3.00
           NaN           NaN
          3.00          3.00
          1.00          1.00
           NaN           NaN
           NaN           NaN
           NaN           NaN
           NaN           NaN
           NaN           NaN

我想找到一种方法将其更改为

          3.00          1.00
          1.00          3.00
          3.00          3.00
          1.00          1.00

我目前正试图通过M(isfinite(M))来做这个,但最终返回一个向量而不是矩阵。有没有让它返回矩阵的技巧?

5 个答案:

答案 0 :(得分:26)

如果每行都没有NaN或所有NaN,可以使用以下方法进行删除:

M(isfinite(M(:, 1)), :)

答案 1 :(得分:19)

最好的方法是

M(any(isnan(M),2),:)=[]

将删除包含至少一个NaN的任何行。

答案 2 :(得分:2)

实际上我想推荐一种稍微不同(也更通用)的方法。

因此,如果您要忽略(即删除)至少有一列包含NaN的所有行,则只需:

M= M(0== sum(isnan(M), 2), :)

答案 3 :(得分:1)

尝试 snip function 。我想在一个简单的函数中解决这样的典型问题:

B = snip(A,nan)

您可以找到function file at

它也适用于所有其他'x','0'或其他任何元素,并处理更多类似的问题。

答案 4 :(得分:1)

以下函数从指定尺寸的数据中删除NAN:

function data_out = remove_nan (data_in, remove_dim)
%remove row or col from the data_in if there is a NaN element

% e.g., data_in =[1 2 3 4 NaN; 1 2 3 4 5; 1 2 3 NaN NaN]
% from this data remove col 4 and 5 such that data_out=[ 1 2 3; 1 2 3; 1 2
% 3]

if nargin==1

    col_loc=any(isnan(data_in),1);
    data_in(:,col_loc)=[];
    data_out=data_in;

elseif nargin==2

    if remove_dim=='col'
        %find the cols with nan and remove the colums
        col_loc=any(isnan(data_in),1);
        data_in(:,col_loc)=[];
        data_out=data_in;
    elseif  remove_dim='row'
        %find the rows with nan and remove the rows
        row_loc=any(isnan(data_in),2);
        data_in(row_loc,:)=[];
        data_out=data_in;
    end
else
    error( 'incorrect no of arguments')

end