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 ]
但它不起作用。
答案 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]};