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