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'
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
进行比较是不可能的。您必须使用[]
来获取数组。你可以在这里找到关于逗号分隔列表的解释:我现在知道我的答案与你的类似,但我在同一列中讨论了非统一内容(数字和字符串)的情况,所以我希望你不介意