如何用NaN替换单元阵列中的所有Inf值?

时间:2015-06-24 08:29:12

标签: matlab cell-array

我在Matlab中有一个 2 -by- 54 单元格数组。有时,第二行包含一些Inf值。我想将所有Inf值转换为NaN值并尝试使用此代码:

dataC(cellfun(@isinf, dataC, 'UniformOutput', false)) = {NaN};

其中dataC是我的单元格数组。

但是,在执行此操作时,我收到以下错误:

  

使用subsindex

时出错      

功能' subsindex'未定义类' cell'。

的值

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

要使用您在问题中提出的方法,请删除UniformOutput - 属性,这样就会返回逻辑索引,并且可以直接寻址元素。仅当单元格内容为标量时才有效!

dataC(cellfun(@isinf, dataC)) = {NaN};

编辑:感谢 @Luis Mendo 提及,此处不需要使用find。我的原始解决方案为dataC(find(cellfun(@isinf,dataC))) = {NaN},并在find的地址中使用了不必要的dataC

如果单元格中有数组,请使用以下方法:编写自己的函数并将其作为函数句柄提供。在下面的代码中,我实现了函数replaceInf来进行替换。

function demo
    dataC = ones(2,4);         % generate example data
    dataC = num2cell(dataC);   % convert data to cell array
    dataC{2,3} = Inf;          % assign an Inf value
    dataC{1,2} = [1 2 Inf 3]   % add an array to cell
    dataC{1,2}                 % show the cell

    dataC = cellfun(@replaceInf, dataC, 'UniformOutput', false)
    dataC{1,2}                 % show the array in the cell

end

function out = replaceInf(in)
    in(isinf(in)) = NaN;
    out = in;
end

这给出了以下输出:

dataC = 
    [1]    [1x4 double]    [  1]    [1]
    [1]    [         1]    [Inf]    [1]
ans =
     1     2   Inf     3
dataC = 
    [1]    [1x4 double]    [  1]    [1]
    [1]    [         1]    [NaN]    [1]
ans =
     1     2   NaN     3

答案 1 :(得分:0)

我假设你不是每个单元格都有标量?否则你为什么要使用单元格数组呢?

要使用cellfun,您需要将Inf转换为NaN,但不使用使用赋值运算符(即=)执行此操作

如果您将NaN添加到Inf,则会返回NaN,因此我的策略是创建一个NaN的矩阵,其中Inf和{{1} }} 除此以外。 0找到isinf个元素,但遗憾的是Inf0*NaN,因此您无法添加NaN。但是,isnan(...).*NaN是不确定的,Matlab返回0/0并且NaN为零,因此0/1返回我们需要的内容。把它们放在一起:

0./~isnan(...)

我认为如果细胞内有细胞,这会破裂......