我想在MATLAB中比较list1
和list2
并获取第三个列表list3
,其中包含来自list1
的所有元素,这些元素也在{{1}中}(包括list2
中的重复条目)。
例如,list1
包含元素
list1
和AA,AB,AC,AC,AC,CB
以下内容:
list2
因此,BA,BB,AC,BN,MN,CB,CB
应包含
list3
由于在AC,AC,AC,CB
中可以找到AC
三次,因此在list1
中也可以代表三次。 list3
中CB
两次,list2
只有一次,因此list1
只能显示一次。
我怎样才能在MATLAB中做到这一点?
答案 0 :(得分:2)
您可以使用ismember
。
tf = ismember(A, S)
返回与A
大小相同的数组,其中包含逻辑1
(true
),其中A
的元素位于集S
中其他地方有1}}和逻辑0
(false
)。在集理论术语中,k
为1
,其中A
∈S
。输入A
和S
可以是数字或字符数组或字符串的单元格数组。
如果您将list1
和list2
定义为单元格数组,它将变为如下所示:
list1 = {'AA', 'AB', 'AC', 'AC', 'AC', 'CB'}
list2 = {'BA', 'BB', 'AC', 'BN', 'MN', 'CB', 'CB'}
I = ismember(list1, list2) % positions where the elements of list1 are in the set list2
list3 = list1(ismember(list1, list2))
它将返回:
I = 0 0 1 1 1 1
list3 = 'AC' 'AC' 'AC' 'CB'
您还可以将列表(集)定义为矩阵(如果集合中的所有元素具有相同的长度)。在这种情况下,您需要将另一个参数传递给ismember
。
tf = ismember(A, S, 'rows')
,当A
和S
是具有相同列数的矩阵时,会返回包含1
的向量,其中A
的行也是否则,S
和0
行。如果A
或S
是字符串的单元格数组,则无法使用此语法。
list1 = ['AA'; 'AB'; 'AC'; 'AC'; 'AC'; 'CB']
list2 = ['BA'; 'BB'; 'AC'; 'BN'; 'MN'; 'CB'; 'CB']
I = ismember(list1, list2, 'rows')
list3 = list1(ismember(list1, list2, 'rows'), :)
返回:
I =
0
0
1
1
1
1
list3 =
AC
AC
AC
CB