【问题标题】:Removing non-numeric data from MATLAB cell arrays从 MATLAB 元胞数组中删除非数字数据
【发布时间】:2016-03-11 16:50:04
【问题描述】:

我有一个包含字符串标识符的 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'.

【问题讨论】:

  • 在获取emptyIdx 时不要使用'uni' 0 标志。我认为你的问题是 emptyIdx 是一个单元格数组,它不能很好地进行索引。

标签: arrays matlab cell-array


【解决方案1】:

正如其他人所说,您的问题的根源是您试图使用元胞数组作为索引。这是因为cellfununiform 输入决定是否返回元胞数组(false) 的数值数组(true)。

话虽如此,我可能不会使用cellfun,而可能只是直接在元胞数组上使用str2double 来确定哪些是有效数字(它返回非数字的NaN)。

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

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

【讨论】:

    【解决方案2】:

    对于使用emptyIdxcellfun 的第二次调用,不要将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'
    

    【讨论】:

    • 非常感谢您花时间回答。很高兴看到我哪里出错了,尽管最后我选择了非手机娱乐的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 2011-09-07
    相关资源
    最近更新 更多