从Matlab的单元格数组中删除'NaN'字符串和[]单元格

时间:2018-12-26 06:26:14

标签: string matlab cell nan empty-list

我有一个单元格数组,表示为

raw = {100 3.2 38 1;
       100 3.7 38 1;
       100 'NaN' 'NaN' 1;
       100 3.8 38 [];
       'NaN' 'NaN' 'NaN' 'NaN';
       'NaN' 'NaN' 'NaN' []; 
        100 3.8 38 1};

如何删除至少包含一个'NaN'字符串和空单元格[]的行?因此,在这种情况下,我想从上述单元阵列中删除第3、4、5和6行。预先感谢!

2 个答案:

答案 0 :(得分:0)

在您的细胞数组中,值NaN被定义为字符串,而不是“特殊”值NaN

在这种情况下,可以使用函数isemptyisfloat来识别单元数组的哪些元素为空或为float类型:

% Remove rows with empty cells
idx=any(cell2mat(cellfun(@isempty,raw,'UniformOutput',false)),2)
raw(idx,:)=[]

% Remove rows with 'NaN'
idx=all(cell2mat(cellfun(@isfloat,raw,'UniformOutput',false)),2)
raw(~idx,:)=[]

在第一步中,您将使用函数isempty查找空单元,因为输入是一个单元数组,因此必须使用cellfun将functino应用于单元数组的所有元素。

isempty返回一个01的单元格数组,其中1标识一个空单元格,因此在将其转换为数组后(带有functino {{1 }}),您可以使用函数cell2mat来识别具有空单元格的roww的索引。

在第二步中,采用类似的方法,您可以使用函数“ isfloat”来标识包含浮点值的行。

如果您将细胞数组中的any定义为“值”而不是字符串,则可以使用相同的方法:

NaN

答案 1 :(得分:0)

要查找运行“ NaN”的行:

idxNan = any(cellfun(@(x) isequal(x,'NaN'),raw),2);

同样,要查找哪些行具有空单元格,请运行:

idxEmpty = any(cellfun(@(x) isempty(x),raw),2);

然后,您可以使用“或”省略不需要的行

raw(idxNan | idxEmpty,:) = [];
如果您的意思是

|替换为&