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

问题描述 投票:0回答:6

我正在寻找一种有效地从 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)) 来做到这一点,但最终返回一个向量而不是矩阵。有没有办法让它返回一个矩阵?

matlab
6个回答
27
投票

如果每行没有 NaN 或全部为 NaN,您可以使用以下方法进行删除:

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

20
投票

最好的方法是

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

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


2
投票

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

因此,如果您想忽略(即删除)至少一列包含

NaN
的所有行,则只需:

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

1
投票

试试我的

snip function
。我想用一个简单的函数来解决这样的典型问题:

B = snip(A,nan)

您可以在找到

功能文件

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


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

0
投票

在我的例子中,M 是一个数据向量,末尾有一些 NaN 值。根据情况,NaN 值的数量有所不同。

我用过:

M = M(查找(isfinite(M)==1)); % 删除 NaN 值

© www.soinside.com 2019 - 2024. All rights reserved.