MATLAB 中异构元胞数组中字符的逻辑索引

Logical indexing of chars in heterogenous cell array in MATLAB

我有一个异构元胞数组,主要包含数字,但包含一列字符。我想识别那些字符列中的值等于某个字符串 'X' 的行。我的数组看起来像这样:

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

我的问题有两个:

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

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

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

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

非常感谢任何提示!

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

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

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

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

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

答案使用 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'

您可以使用 strcmp 适用于元胞数组这一事实,并且 returns 如果其中一个参数不是字符串(以及如果字符串是不同的)。所以,

  • 第(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'