MATLAB中异构单元阵列中字符的逻辑索引

时间:2015-02-03 22:31:57

标签: arrays matlab logical-operators

我有一个异质的单元格数组,主要包含数字但只包含一列字符。我想识别那些字符列中的值等于某个字符串'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)是必要的。

非常感谢任何提示!

3 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您可以使用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'