【问题标题】:Replace Nan by a number in a cell array with Matlab用 Matlab 将 Nan 替换为元胞数组中的数字
【发布时间】:2016-10-08 02:46:16
【问题描述】:
a = { [5 5 5 6 ] [ Nan Nan Nan Nan]; [ 7 8 8 8 ] [1 2 3 5] }

我想用[1 1 1 1 ]替换a{1,2}

有可能吗?因为我试过这个功能:

function k = non(a)
[l ,c ] = size(a);

for i= 1 : l

  for j =1 : c
     if a{i,j} == [ NaN NaN NaN NaN ]
          k{i,j} = [ 1 1 1 1] 
     else
          k{i,j} = a{i,j} ;
     end
  end
end
end

但它不起作用。

【问题讨论】:

  • 您应该使用isequal(a{i,j}, [NaN, NaN, NaN, NaN]) 而不是a{i,j} == [NaN, NaN, NaN, NaN]。还有其他方法可以改进此代码,但您应该先尝试一下。
  • @ParagS.Chandakkar:不,你不能用NaNs 做到这一点! NaN 值永远不等于任何东西,甚至不等于它本身!试试isequal(NaN, NaN),你会发现它是 False (0)!你可能在想isnan()
  • @gariepy 我知道...我不明白我在写这篇文章时在想什么!

标签: matlab replace nan


【解决方案1】:

您可以定义以下简单函数:

function matrix = replace_nan(matrix, value)
  matrix(isnan(matrix)) = value;
end

然后使用 cellfun 在单元格数组的所有元素上执行它(我通过允许您将 value 定义为替换 NaN 的数字并使元素可变长度,稍微概括了您的问题):

>> a = {[ 3 NaN] [NaN NaN NaN] [1 2 3 4 5 NaN 0 NaN]};
>> value = 1; %% the value to replace the NaN with
>> z = cellfun(@replace_nan, a, repmat( {value}, size(a,1), size(a,2)) , 'UniformOutput', 0);
>> z{1}
ans =
     3     1
>> z{2}
ans =
     1     1     1
>> z{3}
ans =
     1     2     3     4     5     1     0     1

这里有几个关于cellfun 使用的cmets:cellfun 接受一个函数,在这种情况下是replace_nan,和一个元胞数组,在这种情况下是a,并将函数调用迭代到replace_nan() .如果replace_nan 是一个单参数函数,我们可以说cellfun(@replace_nan, a),但按照我定义的方式,该函数有两个参数。在 cellfun 中指定的方法是提供带有 value 参数的第二个元胞数组。那就是repmat({1},size(a,1),size(a,2)),它创建了第二个单元数组,其尺寸与a 相同,但填充了1

编辑:评论讨论提出了一个很好的观点:您不能使用== 来测试NaN,您必须使用MATLAB 的isnan() 函数。

>> [NaN NaN] == [NaN NaN]
ans =
     0     0
>> isnan( [NaN NaN] )
ans =
     1     1

【讨论】:

    【解决方案2】:

    这样甚至更短:

    a(cellfun(@(cell) any(isnan(cell(:))),a))={[1 1 1 1]};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-13
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多