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