本页对应的英文页面已更新,但尚未翻译。 若要查看最新内容,请点击此处访问英文页面。

ismember

判断数组元素是否为集数组成员

说明

示例

如果 A 中某位置的数据能在 B 中找到,Lia = ismember(A,B) 将返回一个在该位置包含逻辑值 1 (true) 的数组。数组中的其他位置将包含逻辑值 0 (false)。

  • 如果 AB 是表或时间表,ismember 将为每一行返回一个逻辑值。对于时间表,ismember 在确定相等性时会考虑行时间。输出 Lia 是一个列向量。

Lia = ismember(A,B,'rows')AB 中的每一行视为一个实体,当 A 中的行也存在于 B 中时,将返回包含逻辑值 1 (true) 的列向量。数组中的其他位置将包含逻辑值 0 (false)。

'rows' 选项不支持元胞数组,除非其中一个输入项为分类数组或日期时间数组。

示例

使用上述任何语法,[Lia,Locb] = ismember(___) 还会返回数组 Locb

  • 一般情况下,对于 A 中属于 B 的成员的每一个值,Locb 会包含该值在 B 中的最小索引。值为 0 表示 A 不是 B 的成员。

  • 如果指定了 'rows' 选项,Locb 将在 B 中为 AB 中共有的每个行包含最小索引。值为 0 表示 A 不是 B 中的行。

  • 如果 AB 是表或时间表,Locb 将在 B 中为 AB 中共有的每个行包含最小索引。值为 0 表示 A 不是 B 中的行。

示例

[Lia,Locb] = ismember(___,'legacy') 保留了 ismember 函数在 R2012b 和早期版本中的行为,它可保证函数在结合前面所述语法中的任何输入参数使用时能够得到与之前版本一致的结果。

'legacy' 选项不支持分类数组、日期时间数组、持续时间数组、表或时间表。

示例

全部折叠

创建都包含某些值的两个向量。

A = [5 3 4 2]; 
B = [2 4 4 4 6 8];

确定 A 的哪些元素同时也在 B 中。

Lia = ismember(A,B)
Lia = 1x4 logical array

   0   0   1   1

A(3)A(4) 可以在 B 中找到。

创建都包含某些行的两个表。

A = table([1:5]',['A';'B';'C';'D';'E'],logical([0;1;0;1;0]))
A=5×3 table
    Var1    Var2    Var3 
    ____    ____    _____

     1       A      false
     2       B      true 
     3       C      false
     4       D      true 
     5       E      false

B = table([1:2:10]',['A';'C';'E';'G';'I'],logical(zeros(5,1)))
B=5×3 table
    Var1    Var2    Var3 
    ____    ____    _____

     1       A      false
     3       C      false
     5       E      false
     7       G      false
     9       I      false

确定 A 中的哪些行同时也存在于 B 中。

Lia = ismember(A,B)
Lia = 5x1 logical array

   1
   0
   1
   0
   1

A(1,:)A(3,:)A(5,:) 可以在 B 中找到的。

创建都包含某些值的两个向量。

A = [5 3 4 2]; 
B = [2 4 4 4 6 8];

确定 A 的哪些元素同时也在 B 中及其在 B 中的相应位置。

[Lia,Locb] = ismember(A,B)
Lia = 1x4 logical array

   0   0   1   1

Locb = 1×4

     0     0     2     1

A(3) 的最小索引为 B(2)A(4) 可以在 B(1) 中找到。

创建向量 x。通过变换和取消变换 x 来获取第二个向量 y。此变换会向 y 中引入舍入误差。

x = (1:6)'*pi;
y = 10.^log10(x);

通过取差值来验证 xy 不同。

x-y
ans = 6×1
10-14 ×

    0.0444
         0
         0
         0
         0
   -0.3553

使用 ismember 以查找 x 内位于 y 中的元素。ismember 函数执行精确比较并确定 x 中的某些矩阵元素不是 y 的成员。

lia = ismember(x,y)
lia = 6x1 logical array

   0
   1
   1
   1
   1
   0

使用 ismembertol 执行使用较小容差的比较。ismembertol 将容差范围内的元素视为相等元素并确定 x 中的所有元素都为 y 的成员。

LIA = ismembertol(x,y)
LIA = 6x1 logical array

   1
   1
   1
   1
   1
   1

创建表 A,其中包含五个人的性别、年龄和身高。

A = table(['M';'M';'F';'M';'F'],[27;52;31;46;35],[74;68;64;61;64],...
'VariableNames',{'Gender' 'Age' 'Height'},...
'RowNames',{'Ted' 'Fred' 'Betty' 'Bob' 'Judy'})
A=5×3 table
             Gender    Age    Height
             ______    ___    ______

    Ted        M       27       74  
    Fred       M       52       68  
    Betty      F       31       64  
    Bob        M       46       61  
    Judy       F       35       64  

创建另一个与 A 具有共有行的表 B

B = table(['M';'F';'F';'F'],[47;31;35;23],[68;64;62;58],...
'VariableNames',{'Gender' 'Age' 'Height'},...
'RowNames',{'Joe' 'Meg' 'Beth' 'Amy'})
B=4×3 table
            Gender    Age    Height
            ______    ___    ______

    Joe       M       47       68  
    Meg       F       31       64  
    Beth      F       35       62  
    Amy       F       23       58  

确定 A 的哪些行同时也在 B 中及其在 B 中的相应位置。

[Lia,Locb] = ismember(A,B)
Lia = 5x1 logical array

   0
   0
   1
   0
   0

Locb = 5×1

     0
     0
     2
     0
     0

值相同而名称不同的两行将被视为相等。Betty 的数据同样也在 B(2,:) 中找到,与 Meg 对应。

创建都包含某行的两个矩阵。

A = [1 3 5 6; 2 4 6 8];
B = [2 4 6 8; 1 3 5 7; 2 4 6 8];

确定 A 的哪些行同时也在 B 中及其在 B 中的相应位置。

[Lia, Locb] = ismember(A,B, 'rows')
Lia = 2x1 logical array

   0
   1

Locb = 2×1

     0
     1

A(2,:) 的最小索引是 B(1,:)

创建两个包含 NaN 的向量。

A = [5 NaN NaN]; 
B = [5 NaN NaN];

确定 A 的哪些元素同时也在 B 中及其在 B 中的相应位置。

[Lia,Locb] = ismember(A,B)
Lia = 1x3 logical array

   1   0   0

Locb = 1×3

     1     0     0

ismemberNaN 值视为不同的值。

创建字符向量元胞数组 A

A = {'dog','cat','fish','horse'};

创建字符向量元胞数组 B,其中某些向量带有尾随空白。

B = {'dog ','cat','fish ','horse'};

确定 A 的哪些字符向量同时也在 B 中。

[Lia,Locb] = ismember(A,B)
Lia = 1x4 logical array

   0   1   0   1

Locb = 1×4

     0     2     0     4

ismember 将字符向量元胞数组中的尾随空白视为不同的字符。

创建字符向量 A 和字符向量元胞数组 B

A = ['cat';'dog';'fox';'pig'];
B = {'dog','cat','fish','horse'};

确定 A 的哪些字符向量同时也在 B 中。

[Lia,Locb] = ismember(A,B)
Lia = 4x1 logical array

   1
   1
   0
   0

Locb = 4×1

     2
     1
     0
     0

在代码中使用 'legacy' 标志以保留 R2012b 和早期版本中 ismember 的行为。

使用当前行为查找 B 的成员。

A = [5 3 4 2]; 
B = [2 4 4 4 6 8];
[Lia1,Locb1] = ismember(A,B)
Lia1 = 1x4 logical array

   0   0   1   1

Locb1 = 1×4

     0     0     2     1

查找 B 的成员并保留旧版行为。

[Lia2,Locb2] = ismember(A,B,'legacy')
Lia2 = 1x4 logical array

   0   0   1   1

Locb2 = 1×4

     0     0     4     1

输入参数

全部折叠

查询数组,指定为数值数组、逻辑数组、字符数组、字符串数组、分类数组、日期时间数组、持续时间数组、字符向量元胞数组、表或时间表。如果指定 'rows' 选项,则 AB 的列数必须相同。

AB 必须是相同类,以下情况例外:

  • logicalchar 和所有数值类可以与 double 数组合并。

  • 字符向量元胞数组可与字符数组或字符串数组合并。

  • 分类数组可与字符数组、字符向量元胞数组或字符串数组合并。

  • 日期时间数组可与日期字符向量元胞数组或单个日期字符向量合并。

根据数据类型,对 AB 还有其他要求:

  • 如果 AB 均为有序分类数组,则必须具有相同的类别集(包括其顺序)。如果 AB 都不是有序分类数组,则不必具有相同的类别集,因此可使用类别名称对两者进行比较。

  • 如果 A 是表或时间表,则必须具有与 B 相同的变量名称(顺序除外)。对于表,将忽略行名称,所以值相同而名称不同的两行将被视为相等。对于时间表,将考虑行时间,所以值相同而时间不同的两行将被视为不相等。

  • 如果 AB 是日期时间数组,则它们在是否指定时区方面彼此之间必须一致。

对于文本输入,ismember 通常不会忽略字符向量、字符向量元胞数组和字符串数组中的尾随空格。但是,某些情况下,ismember 会忽略尾随空格:

  • 如果 A 是字符数组,而 B 是字符向量元胞数组,则 ismember 将忽略字符数组中的尾随空格。

  • 如果指定了 'rows' 选项,则 ismember 将忽略字符向量和字符数组中的尾随空格。

A 还可以是具有以下类方法的对象:

  • sort(或 'rows' 选项的 sortrows

  • eq

  • ne

对象类方法彼此之间必须一致。这些对象包括从相同根类导出的异构数组。例如,A 可以是图形对象的句柄的数组。

集数组,指定为数值数组、逻辑数组、字符数组、字符串数组、分类数组、日期时间数组、持续时间数组、字符向量元胞数组、表或时间表。如果指定 'rows' 选项,则 AB 的列数必须相同。

BA 必须是相同类,以下情况例外:

  • logicalchar 和所有数值类可以与 double 数组合并。

  • 字符向量元胞数组可与字符数组或字符串数组合并。

  • 分类数组可与字符数组、字符向量元胞数组或字符串数组合并。

  • 日期时间数组可与日期字符向量元胞数组或单个日期字符向量合并。

根据数据类型,对 AB 还有其他要求:

  • 如果 AB 均为有序分类数组,则必须具有相同的类别集(包括其顺序)。如果 AB 都不是有序分类数组,则不必具有相同的类别集,因此可使用类别名称对两者进行比较。

  • 如果 B 是表或时间表,则必须具有与 A 相同的变量名称(顺序除外)。对于表,将忽略行名称,所以值相同而名称不同的两行将被视为相等。对于时间表,将考虑行时间,所以值相同而时间不同的两行将被视为不相等。

  • 如果 AB 是日期时间数组,则它们在是否指定时区方面彼此之间必须一致。

对于文本输入,ismember 通常不会忽略字符向量、字符向量元胞数组和字符串数组中的尾随空格。但是,某些情况下,ismember 会忽略尾随空格:

  • 如果 A 是字符数组,而 B 是字符向量元胞数组,则 ismember 将忽略字符数组中的尾随空格。

  • 如果指定了 'rows' 选项,则 ismember 将忽略字符向量和字符数组中的尾随空格。

B 还可以是具有以下类方法的对象:

  • sort(或 'rows' 选项的 sortrows

  • eq

  • ne

对象类方法彼此之间必须一致。这些对象包括从相同根类导出的异构数组。例如,B 可以是图形对象的句柄的数组。

输出参数

全部折叠

A 的逻辑索引,如果 A 中的某些值(或行)是 B 的成员,则返回在相应位置包含逻辑值 1 (true) 的向量、矩阵或 N 维数组。其他位置则包含逻辑值 0 (false)。

Lia 是大小与 A 相同的数组,除非您指定 'rows' 标志。

如果指定了 'rows' 标志,或者 A 是表或时间表,Lia 则为一个列向量,且其行数与 A 的行数相同。

B 中的位置,返回为向量、矩阵或 N 维数组。如果未指定 'legacy' 标志,对于 A 中属于 B 的成员的值,Locb 会包含这些值(行)在 B 中的最小索引。值为 0 表示 A 不是 B 的成员。

Locb 是大小与 A 相同的数组,除非您指定 'rows' 标志。

如果指定了 'rows' 标志,或者 A 是表或时间表,Locb 则为一个列向量,且其行数与 A 的行数相同。

提示

  • 使用 ismembertol,可以利用容差进行浮点数之间的比较。

  • 要查找表或时间表 AB 中共有的有关变量子集的行,可以使用列下标。例如,可以使用 ismember(A(:,vars),B(:,vars)),其中 vars 为正整数、正整数向量、变量名称、变量名称元胞数组或逻辑向量。您也可以使用 vartype 创建一个下标,以选择指定类型的变量。

扩展功能

在 R2006a 之前推出