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

MATLAB:如何有效地去除矩阵中的NaN元素,matlab,Matlab,我正在寻找一种有效地从MATLAB中的矩阵中删除NaN数的方法(即不使用for循环) 我将提供一个快速的例子来说明我试图实现的目标: 假设我有一个矩阵M: 3.00 1.00 1.00 3.00 NaN NaN 3.00 3.00 1.00 1.00 NaN Na

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

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

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

事实上,我想推荐一种稍微不同(更一般)的方法

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

M= M(0== sum(isnan(M), 2), :)
最好的办法是

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

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

请尝试我的
剪切功能。我想在一个简单的函数中解决这样的典型问题:

B = snip(A,nan)
你可以找到


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

以下函数从指定维度的数据中删除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

正是我想要的。谢谢您知道这是否比Steve建议的重塑命令更快吗?请使用此方案。这肯定比移除所有NAN后使用重塑更有效。@jeremiah willcock@woodchips。。。如何对
M(all(isnan(M),1),:)=[]列执行此操作由于某种原因无法工作。我转置并使用了这个,但应该有一个更好的方法。感谢这将删除
inf
值。最好使用
M(~isnan(M(:,1)),:)
我建议
M=M(~any(isnan(M),2),:)
如果您正在为它编写函数,为什么
remove\u dim
是字符串?为什么只支持二维阵列?为什么不支持N-D数组,并像其他许多方法一样使用“沿维”参数呢?它可能会起作用,但似乎这个答案既有很高的复杂性,又有很低的灵活性。至少维度输入应该是一个数字,这将大大简化您的代码。@DennisJaheruddin它可以工作,我使用它来处理TB中的大型数据集,特别是CSV文件。我在2D数据集/数据库上寻找面向行或列的数据的函数,但找不到。所以我想到了分享。它可以扩展到N维。它似乎可以工作,但感觉不直观。使用字符串
'1'
删除值1。但是使用值
nan
删除值
nan
。如果要删除字符
'1'
,您应该怎么做我认为它能做的事情可能是合理的,但你要求它的方式只是一种痛苦。当涉及更高维度时,会发生什么也不清楚。