Main Content

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

setdiff

设置两个数组的差集

说明

示例

C = setdiff(A,B) 返回 A 中存在但 B 中不存在的数据,不包含重复项。C 是有序的。

  • 如果 AB 为表或时间表,则 setdiff 返回 A 中存在但 B 中不存在的行。对于时间表,setdiff 在确定相等性时会考虑行时间,并按行时间对输出时间表 C 进行排序。

示例

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

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

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

示例

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

  • 通常,C = A(ia)

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

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

示例

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

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

示例

全部折叠

定义都包含某些值的两个向量。

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

查找 A 中存在,但 B 中不存在的值。

C = setdiff(A,B)
C = 1×3

     1     3     5

定义都包含某些行的两个表。

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 中不存在的行。

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

     2       B      true 
     4       D      true 

定义都包含某些值的两个向量。

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

查找 A 中存在,但 B 中不存在的值以及索引向量 ia,以使 C = A(ia)

[C,ia] = setdiff(A,B)
C = 1×3

     1     3     5

ia = 3×1

     4
     1
     5

定义表 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  

定义一个表 B,其中包含与 A 相同的变量。

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

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

查找 A 中存在,但 B 中不存在的行以及索引向量 ia,以使 C = A(ia,:)

[C,ia] = setdiff(A,B)
C=4×3 table
            Gender    Age    Height
            ______    ___    ______

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

ia = 4×1

     5
     1
     4
     2

C 的行先按 Gender 排序,然后按 Age 排序。

定义都包含某些行的两个矩阵。

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

查找 A 中存在,但 B 中不存在的行以及索引向量 ia,以使 C = A(ia,:)

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

     1     4     5
     7     9     7

ia = 2×1

     5
     1

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

C 中的值的顺序很重要时,指定 'stable''sorted'

A = [3 6 2 1 5 1 1]; 
B = [2 4 6];
[C,ia] = setdiff(A,B,'stable')
C = 1×3

     3     1     5

ia = 3×1

     1
     4
     5

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

 [C,ia] = setdiff(A,B,'sorted')
C = 1×3

     1     3     5

ia = 3×1

     4
     1
     5

定义两个包含 NaN 的向量。

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

计算 AB 的差集。

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

   NaN   NaN

setdiffNaN 值视为不同的值。

创建字符向量元胞数组 A

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

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

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

查找 A 中存在但 B 中不存在的字符向量。

[C,ia] = setdiff(A,B)
C = 1x2 cell
    {'dog'}    {'fish'}

ia = 2×1

     1
     3

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

创建字符向量 A

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

创建字符向量元胞数组 B

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

查找 A 中存在但 B 中不存在的字符向量。

C = setdiff(A,B)
C = 2x1 cell
    {'fox'}
    {'pig'}

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

class(C)
ans = 
'cell'

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

计算 AB 的差集并保留当前行为。

A = [3 6 2 1 5 1 1]; 
B = [2 4 6];
[C1,ia1] = setdiff(A,B)
C1 = 1×3

     1     3     5

ia1 = 3×1

     4
     1
     5

计算 AB 的差集并保留旧版行为。

[C2,ia2] = setdiff(A,B,'legacy')
C2 = 1×3

     1     3     5

ia2 = 1×3

     7     1     5

输入参数

全部折叠

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

AB 必须属于同一类,以下情况例外:

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

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

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

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

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

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

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

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

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

  • sort(或 'rows' 选项的 sortrows

  • eq

  • ne

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

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

标志说明
'sorted'

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

示例

C = setdiff([4 1 3 2 5],[2 1],'sorted')
C =

     3     4     5

'stable'

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

示例

C = setdiff([4 1 3 2 5],[2 1],'stable')
C =

     4     3     5

数据类型: char | string

输出参数

全部折叠

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

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

  • 如果未指定 'rows' 标志并且 A 为行向量,则 C 为行向量。

  • 如果未指定 'rows' 标志并且 A 不是行向量,则 C 为列向量。

  • 如果指定了 'rows' 标志,则 C 是一个包含 A 中存在,但 B 中不存在的行的矩阵。

  • 如果 A 的所有值(或行)也在 B 中,则 C 为空矩阵。

C 的类与 A 的类相同,除非:

  • A 是字符数组而 B 是字符向量元胞数组,在这种情况下,C 是字符向量元胞数组。

  • A 是字符向量、字符向量元胞数组或字符串,而 B 是分类数组,在这种情况下,C 是分类数组。

  • A 是字符向量元胞数组或单个字符向量,而 B 是日期时间数组,在这种情况下,C 是日期时间数组。

  • A 是字符向量或字符向量元胞数组,而 B 是字符串数组,在这种情况下,C 是字符串数组。

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

提示

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

扩展功能

在 R2006a 之前推出