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

Removing 'NaN' strings and [] cells from cell array in Matlab

我有一个元胞数组,给出为

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 行。提前致谢!

在你的 cellarray 中,值 NaN 被定义为字符串而不是 "special" 值 NaN

在这种情况下,您可以使用函数 isemptyisfloat 来识别 cellarray 的哪些元素为空或 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 查找空单元格,因为输入是一个 cellarray,您必须使用 cellfun 将函数应用于单元格的所有元素数组。

isempty returns 01 的 cellarray,其中 1 标识一个空单元格,因此,在将其转换为数组后(使用 functino cell2mat) 您可以使用函数 any.

识别带有空单元格的 roww 的索引

在第二步中,使用类似的方法,您可以使用函数 `isfloat 来识别包含浮动值的行。

如果您的 cellarray 中的 NaN 定义为 "values" 而不是字符串,则可以使用相同的方法:

idx=any(cell2mat(cellfun(@isempty,raw,'UniformOutput',false)),2)
raw(idx,:)=[]
idx=any(cell2mat(cellfun(@isnan,raw,'UniformOutput',false)),2)
raw(idx,:)=[]

查找哪一行有'NaN'运行:

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

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

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

然后您可以使用 'or'

省略不需要的行
raw(idxNan | idxEmpty,:) = [];

| 替换为 & 如果那是你的意思