用Matlab在单元数组中用数字替换Nan

时间:2016-06-08 02:19:23

标签: matlab replace nan

connect()

我想将a = { [5 5 5 6 ] [ Nan Nan Nan Nan]; [ 7 8 8 8 ] [1 2 3 5] } 替换为a{1,2}

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

[1 1 1 1 ]

但它不起作用。

2 个答案:

答案 0 :(得分:2)

您可以定义以下简单功能:

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在此处的使用的一些评论: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

答案 1 :(得分:0)

甚至更短的方式:

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