Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

intersect

设置两个数组的交集

说明

示例

C = intersect(A,B) 返回 AB 的共有数据,但是不包含重复项。C 已排序。

  • 如果 AB 是表或时间表,intersect 将返回这两个表的共有行集。对于时间表,intersect 在确定相等性时会考虑行时间,并且会按行时间对输出时间表 C 进行排序。

示例

C = intersect(A,B,setOrder) 以特定顺序返回 CsetOrder 可以是 'sorted''stable'

C = intersect(A,B,___,'rows')C = intersect(A,B,'rows',___)AB 的每一行都视为单个实体,并返回 AB 的共有行,但是不包含重复项。必须指定 ABsetOrder 是可选的。

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

示例

[C,ia,ib] = intersect(___) 还使用上述任何语法返回索引向量 iaib

  • 一般情况下,C = A(ia)C = B(ib)

  • 如果指定了 'rows' 选项,则 C = A(ia,:)C = B(ib,:)

  • 如果 AB 是表或时间表,则 C = A(ia,:)C = B(ib,:)

示例

[C,ia,ib] = intersect(A,B,'legacy')[C,ia,ib] = intersect(A,B,'rows','legacy') 保留 R2012b 和早期版本中 intersect 函数的行为。

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

示例

全部折叠

创建两个具有某些相同值的向量。

A = [7 1 7 7 4]; 
B = [7 0 4 4 0];

查找 AB 的共有值。

C = intersect(A,B)
C = 1×2

     4     7

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

A = table([1:5]',categorical({'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]',categorical({'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

查找 AB 的共有行。

C = intersect(A,B)
C=3×3 table
    Var1    Var2    Var3 
    ____    ____    _____

     1       A      false
     3       C      false
     5       E      false

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

A = [7 1 7 7 4]; 
B = [7 0 4 4 0];

查找 AB 以及索引向量 iaib 的共有值,使得 C = A(ia) 并且 C = B(ib)

[C,ia,ib] = intersect(A,B)
C = 1×2

     4     7

ia = 2×1

     5
     1

ib = 2×1

     3
     1

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

A = table(categorical({'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(categorical({'F';'M';'F';'F'}),...
[31;47;35;23],[64;68;62;58],...
'VariableNames',{'Gender' 'Age' 'Height'},...
'RowNames',{'Meg' 'Joe' 'Beth' 'Amy'})
B=4×3 table
            Gender    Age    Height
            ______    ___    ______

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

查找 AB 以及索引向量 iaib 的共有行,使得 C = A(ia,:) 并且 C = B(ib,:)

[C,ia,ib] = intersect(A,B)
C=1×3 table
             Gender    Age    Height
             ______    ___    ______

    Betty      F       31       64  

ia = 3
ib = 1

值相同而名称不同的两行将被视为相等。因此,我们发现 Betty A(3,:) 和 Meg, B(1,:) 的性别、年龄及身高都相同。

创建两个包含共有行的矩阵。

A = [2 2 2; 0 0 1; 1 2 3; 1 1 1];
B = [1 2 3; 2 2 2; 2 2 0];

查找 AB 以及索引向量 iaib 的共有行,使得 C = A(ia,:) 并且 C = B(ib,:)

[C,ia,ib] = intersect(A,B,'rows')
C = 2×3

     1     2     3
     2     2     2

ia = 2×1

     3
     1

ib = 2×1

     1
     2

AB 的行数无需相同,但列数必须相同。

使用 setOrder 参数指定 C 中值的排序方式。

如果您想要 C 中的值与 A 中的值顺序相同,请指定 'stable'

A = [7 1 7 7 4]; B = [7 0 4 4 0];
[C,ia,ib] = intersect(A,B,'stable')
C = 1×2

     7     4

ia = 2×1

     1
     5

ib = 2×1

     1
     3

此外,还可以指定 'sorted' 顺序。

[C,ia,ib] = intersect(A,B,'sorted')
C = 1×2

     4     7

ia = 2×1

     5
     1

ib = 2×1

     3
     1

创建两个包含 NaN 的向量。

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

查找 AB 的共有值。

C = intersect(A,B)
C = 5

intersectNaN 值视为不同的值。

创建字符向量元胞数组 A

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

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

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

找出 AB 的共有字符向量。

[C,ia,ib] = intersect(A,B)
C = 1x2 cell
    {'cat'}    {'horse'}

ia = 2×1

     2
     4

ib = 2×1

     2
     4

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

创建一个列向量字符数组。

A = ['A';'B';'C'], class(A)
A = 3x1 char array
    'A'
    'B'
    'C'

ans = 
'char'

创建一个包含数值类型 double 的元素的 2×3 矩阵。

B = [65 66 67;68 69 70], class(B)
B = 2×3

    65    66    67
    68    69    70

ans = 
'double'

查找 AB 的共有值。

[C,ia,ib] = intersect(A,B)
C = 3x1 char array
    'A'
    'B'
    'C'

ia = 3×1

     1
     2
     3

ib = 3×1

     1
     3
     5

intersectB 解释为字符数组并返回字符数组 C

class(C)
ans = 
'char'

创建包含三个字母的动物名称的字符向量。

A = ['dog';'cat';'fox';'pig'];
class(A)
ans = 
'char'

创建包含不同长度的动物名称的字符向量元胞数组。

B = {'cat','dog','fish','horse'};
class(B)
ans = 
'cell'

找出 AB 的共有字符向量。

C = intersect(A,B)
C = 2x1 cell
    {'cat'}
    {'dog'}

结果 C 是字符向量元胞数组。

class(C)
ans = 
'cell'

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

使用当前行为查找 AB 的交集。

A = [7 1 7 7 4]; 
B = [7 0 4 4 0];
[C1,ia1,ib1] = intersect(A,B)
C1 = 1×2

     4     7

ia1 = 2×1

     5
     1

ib1 = 2×1

     3
     1

查找 A 的唯一元素并保留旧版行为。

[C2,ia2,ib2] = intersect(A,B,'legacy')
C2 = 1×2

     4     7

ia2 = 1×2

     5     4

ib2 = 1×2

     4     1

输入参数

全部折叠

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

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

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

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

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

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

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

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

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

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

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

  • sort(或 'rows' 选项的 sortrows

  • ne

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

顺序标志以 'sorted''stable' 指定,指示 C 中值(或行)的顺序。

标志说明
'sorted'

sort 返回的排序顺序返回 C 中的值(或行)。

示例

C = intersect([7 0 1 5],[0 2 7 5],'sorted')
C =

     0     5     7

'stable'

C 中的值(或行)按与 A 中所显示相同的顺序返回。

示例

C = intersect([7 0 1 5],[0 2 7 5],'stable')
C =

     7     0     5

数据类型: char | string

输出参数

全部折叠

AB 的共有数据,以向量、矩阵或表的形式返回。如果输入 AB 是表或时间表,则 C 中的变量顺序与 A 中的变量顺序相同。

下面介绍了当输入为向量或矩阵并且未指定 'legacy' 标志时 C 的形状:

  • 如果未指定 'rows' 标志,则 C 为列向量,除非 AB 都是行向量,在这种情况下,C 为行向量。

  • 如果指定了 'rows' 标志,则 C 是一个包含 AB 共用的行的矩阵。

输入 AB 的类确定 C 的类:

  • 如果 AB 的类相同,则 C 为相同类。

  • 如果将 char 或非双精度数值类与 double 合并,则 C 是与非双精度输入相同的类。

  • 如果将 logical 类与 double 合并,则 Cdouble

  • 如果将字符向量元胞数组与 char 合并,则 C 是字符向量元胞数组。

  • 如果将分类数组与字符向量、字符向量元胞数组或字符串合并,则 C 是分类数组。

  • 如果将日期时间数组与日期字符向量元胞数组或单个日期字符向量合并,则 C 是日期时间数组。

  • 如果将字符串数组与字符向量或字符向量元胞数组合并,则 C 是字符串数组。

A 的索引,当未指定 'legacy' 标志时以列向量的形式返回。ia 标识 A 中与 B 共有的值(或行)。如果 A 中存在重复出现的值(或行),则 ia 包含该值(或行)第一次出现位置的索引。

B 的索引,当未指定 'legacy' 标志时以列向量的形式返回。ib 标识 B 中与 A 共有的值(或行)。如果 B 中存在重复出现的值(或行),则 ib 包含该值(或行)第一次出现位置的索引。

提示

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

扩展功能

在 R2006a 之前推出