Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

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]',["red";"green";"blue";"cyan";"magenta"],logical([0;1;0;1;0]))
A=5×3 table
    Var1      Var2       Var3 
    ____    _________    _____

     1      "red"        false
     2      "green"      true 
     3      "blue"       false
     4      "cyan"       true 
     5      "magenta"    false

B = table([1:2:10]',["red";"blue";"magenta";"yellow";"black"],logical(zeros(5,1)))
B=5×3 table
    Var1      Var2       Var3 
    ____    _________    _____

     1      "red"        false
     3      "blue"       false
     5      "magenta"    false
     7      "yellow"     false
     9      "black"      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([true;true;false;true;false],[27;52;31;46;35],[74;68;64;61;64],...
VariableNames=["Smoker" "Age" "Height"],...
RowNames=["Sanchez" "Johnson" "Li" "Diaz" "Brown"])
A=5×3 table
               Smoker    Age    Height
               ______    ___    ______

    Sanchez    true      27       74  
    Johnson    true      52       68  
    Li         false     31       64  
    Diaz       true      46       61  
    Brown      false     35       64  

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

B = table([false;false;false;false],[47;31;35;23],[68;64;62;58],...
VariableNames=["Smoker" "Age" "Height"],...
RowNames=["Nguyen" "Cohen" "Jones" "Garcia"])
B=4×3 table
              Smoker    Age    Height
              ______    ___    ______

    Nguyen    false     47       68  
    Cohen     false     31       64  
    Jones     false     35       62  
    Garcia    false     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

具有相同值但不同行名称的两个表行被视为相等。Li 的数据同样也在 B(2,:) 中找到,与 Cohen 对应。

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

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 将字符串数组以及字符向量元胞数组中的尾随空白视为不同的字符。

在代码中使用 "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 还有其他要求:

  • 如果 A 是分类数组,则 B 可以是分类数组,也可以是字符串数组。在这种情况下,第二个输入 B 是一组类别名称。

  • 如果 AB 均为有序分类数组,则必须具有相同的类别集(包括其顺序)。

    如果 AB 都不是有序分类数组,则不必具有相同的类别集,因此可使用类别名称对两者进行比较。

  • 如果 A 是表或时间表,则必须具有与 B 相同的变量名称(顺序除外)。

    • 对于表,将忽略行名称,所以值相同而名称不同的两行将被视为相等。

    • 对于时间表,将考虑行时间,所以值相同而时间不同的两行将被视为不相等。

  • 如果 AB 是日期时间数组,则它们或者都必须指定时区,或者都必须未设置时区。

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

  • sort(或 "rows" 选项的 sortrows

  • eq

  • ne

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

集合数组,指定为数组、表或时间表。如果指定 "rows" 选项,则 AB 的列数必须相同。

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

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

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

  • 分类数组可以与字符串标量和字符向量结合使用。

  • 日期时间数组可以与格式化为表示日期和时间的字符串数组、字符串标量或字符向量结合使用。

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

  • 如果 A 是分类数组,则 B 可以是分类数组,也可以是字符串数组。在这种情况下,第二个输入 B 是一组类别名称。

  • 如果 AB 均为有序分类数组,则必须具有相同的类别集(包括其顺序)。

    如果 AB 都不是有序分类数组,则不必具有相同的类别集,因此可使用类别名称对两者进行比较。

  • 如果 A 是表或时间表,则必须具有与 B 相同的变量名称(顺序除外)。

    • 对于表,将忽略行名称,所以值相同而名称不同的两行将被视为相等。

    • 对于时间表,将考虑行时间,所以值相同而时间不同的两行将被视为不相等。

  • 如果 AB 是日期时间数组,则它们或者都必须指定时区,或者都必须未设置时区。

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 之前推出