Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays MATLAB中异构单元数组中字符的逻辑索引_Arrays_Matlab_Logical Operators - Fatal编程技术网

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

Arrays MATLAB中异构单元数组中字符的逻辑索引,arrays,matlab,logical-operators,Arrays,Matlab,Logical Operators,我有一个异类单元格数组,其中大部分是数字,只有一列字符。我想识别那些字符列中的值等于某个字符串的行,'X'。我的数组如下所示: array_name = { [0] [2] 'X' ; [4] [1] 'X' ; [9] [7] 'A' ; [9] [1] 'X' ; [4] [4] 'B'}; new_array = { [0] [2] 'X' ;

我有一个异类单元格数组,其中大部分是数字,只有一列字符。我想识别那些字符列中的值等于某个字符串的行,
'X'
。我的数组如下所示:

array_name = { [0] [2] 'X' ; 
               [4] [1] 'X' ; 
               [9] [7] 'A' ; 
               [9] [1] 'X' ; 
               [4] [4] 'B'};
new_array = { [0] [2] 'X' ; 
              [4] [1] 'X' ; 
              [9] [1] 'X'};
我的问题有两个方面:

(1) 由于在数值数组上使用
array\u name=='X'
不会返回我期望的逻辑向量,因此我该如何做

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

array_name = { [0] [2] 'X' ; 
               [4] [1] 'X' ; 
               [9] [7] 'A' ; 
               [9] [1] 'X' ; 
               [4] [4] 'B'};
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,:)

对不起,我不太明白你的第一个问题,但这是第二个问题的答案,我想这也会回答第一个问题

答案利用了它们的优点,即可以立即查看单元数组,并在匹配发生时获取逻辑值

例如:

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'

您可以使用在单元格数组上工作的事实,如果其中一个参数不是字符串(以及字符串不同),则返回
0
。所以

  • 关于问题(1):

    在你的例子中

    result1 =
         0     0     1
         0     0     0
         0     0     0
         0     0     1
         0     0     0
    
    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'
    
  • 关于问题(2):

    result2 = 
        [0]    [2]    'X'
        [4]    [1]    'X'
        [9]    [1]    'X'
    
这种方法的优点是,即使第3列不只包含字符串,它也可以工作。比如说,

result1 =
     0     0     1
     0     0     0
     0     0     0
     0     0     1
     0     0     0
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'

哦,很好的回答,哈哈,我肯定是太复杂了+我也是。非常感谢你。你可以在评论中简要解释一下,为什么在数组名周围使用括号时可以这样做,而当你简单地使用“array_name{:,3}='X'”时却不行呢?
array_name{:,3}
是一个逗号分隔的列表,使用
eq
进行比较是不可能的。您必须使用
[]
来获取数组。你可以在这里找到关于逗号分隔列表的解释:我现在知道我的答案与你的类似,但我在同一列中讨论了非统一内容(数字和字符串)的情况,所以我希望你不介意