【问题标题】:Removing NaN elements from a matrix从矩阵中删除 NaN 元素
【发布时间】:2012-02-13 21:01:39
【问题描述】:

每行有一个 NaN 元素,我想删除它。

A=[NaN  1  2;  
    3  NaN 4;  
   NaN  5  6];  

想要的输出是:

[1 2;  
 3 4;  
 5 6]

【问题讨论】:

    标签: matlab


    【解决方案1】:
    A = [NaN 1 2 ; 3 NaN 4; NaN 5 6]
    sz = size(A);
    B = reshape(A', size(A,1)*size(A,2), 1);
    B(isnan(B)) = [];
    B = reshape(B, sz(2)-1, sz(1))'
    

    【讨论】:

    • +1 矢量化。但同样的警告 - 每行必须至少有一个 nan。
    【解决方案2】:

    我以为可以在一行中完成,但我错了。请参阅下面的解决方案:

    鉴于(添加的行帮助我调试下面的索引):

    >> A = [NaN 1 2 ; 3 NaN 4; NaN 5 6; 7 8 NaN]
    A =
       NaN     1     2
         3   NaN     4
       NaN     5     6
         7     8   NaN
    

    然后:

    >> Atrans = A';
    >> B = reshape(    Atrans(~isnan(Atrans))    ,[],size(Atrans,2))'
    B =
         1     2
         3     4
         5     6
         7     8
    

    顺便说一句,在逻辑索引操作中对数组执行简单逻辑检查的 Matlab 习语非常常见且非常有用。典型的例子是:

    >> x(x>0)   %This returns a 1D column vector of all values of x 
                %which are greater than 0, regardless of the initial
                %size of x.  Multidimensional inputs are unwrapped 
                %column-first
    

    以上所有内容都是尺寸和尺寸处理。

    【讨论】:

      【解决方案3】:

      就是这样 - 请注意,代码并不可靠。它假定确实在每一行中都有一个NaN 元素。

      虽然它不是矢量化解决方案,但它还有其他优点 - 例如清晰的代码。

      for i=1:size(A,1)
         x = A(i,:);
         x(isnan(x)) = [];
         B(i,:) = x;
      end
      

      B

      B =

      1     2
      3     4
      5     6
      

      【讨论】:

      • 你确定,你的代码可以,问题是什么? A(isnan(A))=[] 返回A 的列数组。当应用reshape(注意sz(A,.) 的语法错误)时,它最终交换了第一行和第二行的第一个元素。
      猜你喜欢
      • 2014-09-21
      • 1970-01-01
      • 2012-06-17
      • 2019-11-09
      • 1970-01-01
      • 2021-04-16
      • 2019-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多