【问题标题】:find NaN values is cell array查找 NaN 值是元胞数组
【发布时间】:2012-08-07 14:17:07
【问题描述】:

假设我有以下数组:

a = {1; 'abc'; NaN}

现在我想找出其中包含 NaN 的索引,以便我可以将它们替换为 ''(空字符串)。

如果我将cellfunisnan 一起使用,我会得到一个无用的输出

cellfun(@isnan, a, 'UniformOutput', false)

ans = 
[          0]
[1x3 logical]
[          1]

那么我该如何正确地做到这一点呢?

【问题讨论】:

    标签: matlab cells


    【解决方案1】:

    我在http://www.mathworks.com/matlabcentral/answers/42273找到了答案

    a(cellfun(@(x) any(isnan(x)),a)) = {''}
    

    但是,我不明白...

    【讨论】:

      【解决方案2】:

      确实,正如您发现的那样,这可以通过

      a(cellfun(@(x) any(isnan(x)),a)) = {''}
      

      细分:

      Fx = @(x) any(isnan(x))
      

      将返回一个逻辑标量,无论x 是标量还是向量。 在cellfun 中使用此函数将消除对'UniformOutput', false 的需求:

      >> inds = cellfun(Fx,a)
      inds =
           0
           0
           1
      

      这些可以用作原始数组的索引:

      >> a(inds)
      ans = 
          [NaN]
      

      这反过来又允许分配给这些索引:

      >> a(inds) = {''}
      a = 
          [1]
          'abc'
          ''
      

      请注意,必须对元胞数组本身进行赋值。如果您不明白这一点,请阅读a(inds)a{inds} 之间的区别。

      【讨论】:

      • 如果x是矩阵,则需要将匿名函数改为@(x) any(any(isnan(x)))(即第二次添加any,以确保从函数中得到标量)。
      • @peci1:你是对的。实际上,更一般地,最好使用any(isnan(x(:)),它适用于任何维度的数组并且只调用一次any
      【解决方案3】:
      • a(ind) = [] 将从数组中删除条目
      • a(ind)= {''} 会将 NaN 替换为空字符串。

      如果要删除条目,请使用 = [] 而不是 = {''}
      如果您想用不同的值替换 NaNs,只需使用花括号将其设置为等于该值:

      a(ind) = {value}
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-23
        • 1970-01-01
        • 2013-10-27
        • 2011-07-25
        • 2014-07-10
        • 1970-01-01
        相关资源
        最近更新 更多