【问题标题】:Logical indexing of chars in heterogenous cell array in MATLABMATLAB中异构单元阵列中字符的逻辑索引
【发布时间】:2015-02-03 22:31:56
【问题描述】:

我有一个异构元胞数组,其中大部分是数字,但只有一列字符。我想识别那些字符列中的值等于某个字符串'X' 的行。我的数组看起来像这样:

array_name = { [0] [2] 'X' ; 
               [4] [1] 'X' ; 
               [9] [7] 'A' ; 
               [9] [1] 'X' ; 
               [4] [4] 'B'};

我的问题有两个:

(1) 由于使用array_name == 'X' 不会返回我在数值数组上使用它时所期望的逻辑向量,我该怎么做?

(2) 如何创建一个仅包含满足字符列中的值等于'X' 条件的行的新数组,以便我的输出如下所示:

new_array = { [0] [2] 'X' ; 
              [4] [1] 'X' ; 
              [9] [1] 'X'};

我只对 (1) 感兴趣,因为我认为 (2) 有必要。

非常感谢任何提示!

【问题讨论】:

    标签: arrays matlab logical-operators


    【解决方案1】:

    获取第三列作为逗号分隔的列表并将其连接到一个数组中,然后您可以使用逻辑索引:

    L=[array_name{:,3}]=='X'
    new_array=array_name(L,:)
    

    您也可以使用strcmpi,它可以处理多个字符。

    L=strcmpi(array_name(:,3),'X')
    new_array=array_name(L,:)
    

    【讨论】:

    • 哦,不错的答案哈​​哈,我绝对把事情复杂化了。 +1
    • 我也是。非常感谢。您能否在评论中简要解释一下为什么在 array_name 周围使用括号时这有效,而当您仅使用 "array_name{:,3} == 'X'" 时无效?
    • array_name{:,3} 是一个逗号分隔的列表,无法使用eq 进行比较。您必须使用 [] 来获取数组。你可以在这里找到关于逗号分隔列表的解释:mathworks.com/help/matlab/matlab_prog/…
    • 我现在看到我的回答和你的差不多,但是我在同一列中涵盖了不统一的内容(数字和字符串)的情况,所以希望你不要介意
    【解决方案2】:

    抱歉,我不太明白您的第一个问题,但这是第二个问题的答案,我认为它也会回答第一个问题。

    答案使用regular expressions,它们提供的优势在于可以立即查看元胞数组并在匹配发生时获取逻辑值。

    例子:

    clear
    clc
    
    array_name = { [0] [2] 'X';
        [4] [1] 'X';
        [9] [7] 'A' ;
        [9] [1] 'X'  ;
        [4] [4] 'B'}
    
    %// Check for string 'X' in the cell array.
    FindX = regexp('X',array_name(:,end))
    

    输出是一个包含匹配逻辑索引的单元格:

    FindX = 
    
        [1]
        [1]
        []
        [1]
        []
    

    然后检查非空单元格,即那些值为 1 的单元格;一场比赛

    Idx = ~cellfun(@isempty,FindX);
    
    Idx =
    
         1
         1
         0
         1
         0
    

    然后您可以对原始元胞数组使用逻辑索引:

    OutRows = array_name(Idx,:)
    
    OutRows = 
    
        [0]    [2]    'X'
        [4]    [1]    'X'
        [9]    [1]    'X'
    

    【讨论】:

      【解决方案3】:

      您可以使用strcmp 处理元胞数组这一事实,如果其参数之一不是字符串(以及字符串不同),则返回0。所以,

      • 问题(1):

        result1 = strcmp(array_name,'X');
        

        在您的示例中,

        result1 =
             0     0     1
             0     0     0
             0     0     0
             0     0     1
             0     0     0
        
      • 问题(2):

        result2 = array_name(strcmp(array_name(:,3),'X'),:);
        

        给了

        result2 = 
            [0]    [2]    'X'
            [4]    [1]    'X'
            [9]    [1]    'X'
        

      这种方法的优点是即使第 3 列不只包含字符串也能正常工作。例如,

      array_name = { [0] [2] 'X' ; 
                     [4] [1]  5 ; 
                     [9] [7] 'A' ; 
                     [9] [1] 'X' ; 
                     [4] [4]  6 };
      
      result1 =
           0     0     1
           0     0     0
           0     0     0
           0     0     1
           0     0     0
      
      result2 = 
          [0]    [2]    'X'
          [9]    [1]    'X'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-10
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 2014-04-16
        相关资源
        最近更新 更多