setdiff
设置两个数组的差集
语法
说明
示例
两个向量的差集
定义都包含某些值的两个向量。
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 的向量的差集
定义两个包含 NaN
的向量。
A = [5 NaN NaN]; B = [5 NaN];
计算 A
和 B
的差集。
C = setdiff(A,B)
C = 1×2
NaN NaN
setdiff
将 NaN
值视为不同的值。
带有尾随空白的字符向量元胞数组
创建字符向量元胞数组 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'
保留 setdiff 的旧版行为
在代码中使用 'legacy'
标志以保留 R2012b 和早期版本中 setdiff
的行为。
计算 A
和 B
的差集并保留当前行为。
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
计算 A
和 B
的差集并保留旧版行为。
[C2,ia2] = setdiff(A,B,'legacy')
C2 = 1×3
1 3 5
ia2 = 1×3
7 1 5
输入参数
A,B
— 输入数组
数组
输入数组。如果指定 'rows'
选项,则 A
和 B
的列数必须相同。
A
和 B
必须属于同一类,以下情况例外:
logical
、char
和所有数值类可以与double
数组合并。字符向量元胞数组可与字符数组或字符串数组合并。
分类数组可与字符数组、字符向量元胞数组或字符串数组合并。
日期时间数组可与日期字符向量元胞数组或单个日期字符向量合并。
根据数据类型,对 A
和 B
还有其他要求:
如果
A
和B
均为有序分类数组,则必须具有相同的类别集(包括其顺序)。如果A
和B
都不是有序分类数组,则不必具有相同的类别集,因此可使用类别名称对两者进行比较。在这种情况下,C
的类别中前面是A
的类别,后面跟有不在A
中的B
的类别。类别的顺序与在A
和B
中的顺序相同,将使用类别顺序对C
进行排序。如果
A
和B
是表或时间表,则必须具有相同的变量名称(顺序除外)。对于表,将忽略行名称,所以值相同而名称不同的两行将被视为相等。对于时间表,将考虑行时间,所以值相同而时间不同的两行将被视为不相等。如果
A
和B
是日期时间数组,则它们在是否指定时区方面彼此之间必须一致。
A
和 B
还可以是具有以下类方法的对象:
sort
(或'rows'
选项的sortrows
)eq
ne
对象类方法彼此之间必须一致。这些对象包括从相同根类导出的异构数组。例如,A
和 B
可以是图形对象的句柄数组。
setOrder
— 顺序标志
'sorted'
(默认) | 'stable'
顺序标志以 'sorted'
或 'stable'
指定,指示 C
中值(或行)的顺序。
标志 | 说明 |
---|---|
'sorted' | 按 示例 C = setdiff([4 1 3 2 5],[2 1],'sorted') C = 3 4 5 |
'stable' | 按与 示例 C = setdiff([4 1 3 2 5],[2 1],'stable') C = 4 3 5 |
数据类型: char
| string
输出参数
C
— A
和 B
的差集
向量 | 矩阵 | 表 | 时间表
A
和 B
的差集,以向量、矩阵、表或时间表的形式返回。如果输入 A
和 B
是表或时间表,则 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
是字符串数组。
ia
— A
的索引
列向量
A
的索引,当未指定 'legacy'
标志时以列向量的形式返回。ia
标识 A
中存在,但 B
中不存在的值(或行)。如果有仅在 A
中重复出现的值(或行),则 ia
包含该值(或行)第一次出现位置的索引。
提示
要求出与表或时间表中的变量子集相关的差集,可使用列下标。例如,可以使用
setdiff(A(:,
,其中vars
),B(:,vars
))vars
为正整数、正整数向量、变量名称、变量名称元胞数组或逻辑向量。您也可以使用vartype
创建一个下标,以选择指定类型的变量。
扩展功能
tall 数组
对行数太多而无法放入内存的数组进行计算。
C/C++ 代码生成
使用 MATLAB® Coder™ 生成 C 代码和 C++ 代码。
用法说明和限制:
代码生成不支持对第一个或第二个参数使用元胞数组。
如果不指定
'rows'
选项:输入
A
和B
必须为向量。如果指定'legacy'
选项,则输入A
和B
必须为行向量。可变大小行向量的第一个维度必须具有固定长度 1。可变大小列向量的第二个维度必须具有固定长度 1。
不要使用
[]
表示空集。需使用 1×0 或 0×1 输入(例如zeros(1,0)
)表示空集。如果指定
'legacy'
选项,则空输出为行向量 1×0,永远不会是 0×0。
如果同时指定
'legacy'
和'rows'
选项,则输出ia
为列向量。如果ia
为空,则它是 0×1。它永远不会是 0×0,即使输出C
是 0×0。当
setOrder
不是'stable'
或当您指定'legacy'
选项时,输入必须已按升序进行排序。第一个输出C
按升序排序。复数输入必须为
single
或double
。如果一个输入为复数,另一个输入为实数,请执行以下操作之一:
将
setOrder
设置为'stable'
。按复数升序(按绝对值)对实数输入进行排序。假设实数输入为
x
。使用sort(complex(x))
或sortrows(complex(x))
。
请参阅具有零值虚部的复数数据的代码生成 (MATLAB Coder)。
基于线程的环境
使用 MATLAB® backgroundPool
在后台运行代码或使用 Parallel Computing Toolbox™ ThreadPool
加快代码运行速度。
此函数完全支持基于线程的环境。有关详细信息,请参阅在基于线程的环境中运行 MATLAB 函数。
GPU 数组
通过使用 Parallel Computing Toolbox™ 在图形处理单元 (GPU) 上运行来加快代码执行。
用法说明和限制:
不支持
'legacy'
标志。不支持 64 位整数。
有关详细信息,请参阅Run MATLAB Functions on a GPU (Parallel Computing Toolbox)。
版本历史记录
在 R2006a 之前推出
MATLAB 命令
您点击的链接对应于以下 MATLAB 命令:
请在 MATLAB 命令行窗口中直接输入以执行命令。Web 浏览器不支持 MATLAB 命令。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)