在MATLAB

时间:2016-01-02 03:56:23

标签: matlab cells

假设M是5x1单元格,它看起来像:

3x3 double
3x3 double
3x3 double
3x3 double
3x3 double

举例说明,第一个细胞是:

3  NaN  1
0   1  NaN
4   8   9

我希望将每个单元格的NaN值替换为零。但是,由于cellfun不支持显式赋值(=),我无法正确使用它,如下所示:

D = cellfun(@(x) x(isnan(x)) = 0, D, 'UniformOutput', false);

有办法吗?

2 个答案:

答案 0 :(得分:6)

然后不要使用cellfun。使用实际的for循环:

for ii = 1 : numel(D)
    D{ii}(isnan(D{ii})) = 0;
end

cellfun本质上是一个for循环。但是,如果你真的开始使用cellfun,因为匿名函数不支持赋值,你可能做的一件事是写一个补充函数来执行你想要的在您的代码中执行,然后在使用cellfun时提供此函数的句柄。

创建一个名为replace_nan的函数,其中包含以下内容:

function x = replace_nan(x)
    x(isnan(x)) = 0;
end

现在致电cellfun

D = cellfun(@replace_nan, D, 'UniformOutput', false);

答案 1 :(得分:2)

这是一个解决方案:

N = cell2mat(M);
N(isnan(N)) = 0;
M = mat2cell(N,[3,3,3,3,3],3);

如果您的阵列大小不同,则应调整最后一行。