我在Matlab中有一个 2 -by- 54 单元格数组。有时,第二行包含一些Inf
值。我想将所有Inf
值转换为NaN
值并尝试使用此代码:
dataC(cellfun(@isinf, dataC, 'UniformOutput', false)) = {NaN};
其中dataC
是我的单元格数组。
但是,在执行此操作时,我收到以下错误:
使用subsindex
时出错功能' subsindex'未定义类' cell'。
的值
我该如何解决这个问题?
答案 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
个元素,但遗憾的是Inf
为0*NaN
,因此您无法添加NaN
。但是,isnan(...).*NaN
是不确定的,Matlab返回0/0
并且NaN
为零,因此0/1
返回我们需要的内容。把它们放在一起:
0./~isnan(...)
我认为如果细胞内有细胞,这会破裂......