从MATLAB单元阵列中删除非数字数据

时间:2016-03-11 16:50:05

标签: arrays matlab cell-array

我有一个包含字符串标识符的4x1单元格数组,以及一个4x5单元格数组,其中包含每个实体的5个数据点...

>> ids = { '1'; '2'; 'A'; '4' }

ids = 

 '1'
 '2'
 'A'
 '4'

>> vals = { 11, 12, 13, 14, 15; 21, 22, 23, 24, 25; 31, 32, 33, 34, 35;, 41, 42, 43, 44, 45}

vals = 

 [11]    [12]    [13]    [14]    [15]
 [21]    [22]    [23]    [24]    [25]
 [31]    [32]    [33]    [34]    [35]
 [41]    [42]    [43]    [44]    [45]

我想将ID转换为数字,并在两个单元格数组中删除非数字ID的数据,并留下:

ids = 

 [1]
 [2]
 [4]

vals = 

 [11]    [12]    [13]    [14]    [15]
 [21]    [22]    [23]    [24]    [25]
 [41]    [42]    [43]    [44]    [45]

我想知道这个关键是否解决了哪些索引是空的然后使用这些索引解决了两个单元格数组,但是我不确定在此之后要去哪里...

>> numericIds = cellfun(@str2num, ids, 'un', 0)

numericIds = 

 [1]
 [2]
 []
 [4]

>> emptyIdx = cellfun(@isempty, numericIds, 'un', 0)

emptyIdx = 

 [0]
 [0]
 [1]
 [0]

>> ids(emptyIdx) = []
Error using subsindex
Function 'subsindex' is not defined for values of class 'cell'.

2 个答案:

答案 0 :(得分:2)

对于cellfunemptyIdx的第二次调用,请不要将UniformOutput标志指定为0.删除该选项,它将创建一个可用于直接索引到您的单元格数组,您可以删除条目。

因此,你会这样做:

emptyIdx = cellfun(@isempty, numericIds);

执行此操作后,您可以使用逻辑索引删除受影响的行:

ids(emptyIdx) = [];
vals(emptyIdx,:) = [];

这是一个正在运行的例子:

>> ids = { '1'; '2'; 'A'; '4' }

ids = 

    '1'
    '2'
    'A'
    '4'

>> numericIds = cellfun(@str2num, ids, 'un', 0)

numericIds = 

    [1]
    [2]
    []
    [4]

>> emptyIdx = cellfun(@isempty, numericIds)

emptyIdx =

     0
     0
     1
     0

>> vals = { 11, 12, 13, 14, 15; 21, 22, 23, 24, 25; 31, 32, 33, 34, 35;, 41, 42, 43, 44, 45}

vals = 

    [11]    [12]    [13]    [14]    [15]
    [21]    [22]    [23]    [24]    [25]
    [31]    [32]    [33]    [34]    [35]
    [41]    [42]    [43]    [44]    [45]

>> vals(emptyIdx,:) = []

vals = 

    [11]    [12]    [13]    [14]    [15]
    [21]    [22]    [23]    [24]    [25]
    [41]    [42]    [43]    [44]    [45]

>> ids(emptyIdx) = []

ids = 

    '1'
    '2'
    '4'

答案 1 :(得分:2)

正如其他人所说,问题的根源在于你正在尝试使用单元格数组作为索引。这是因为cellfun的{​​{3}}输入决定了是否返回单元格数组(true)的数字数组(false)。

话虽这么说,我可能不会使用cellfun并且可能只是直接在单元格数组上使用uniform来确定哪些是有效数字(它为非数字返回NaN)

ids = str2double(ids);
tokeep = ~isnan(ids);
ids = ids(tokeep);
vals = vals(tokeep, :)
  

注意:通常,大多数对字符串进行操作的函数(例如str2double对字符串的单元格数组进行操作。