# ty_setdiff
设置两个数组的差集
函数库: TyBase
# 语法
C = ty_setdiff(A,B)
C = ty_setdiff(A,B,setOrder)
C = ty_setdiff(A,B,___,"rows")
C = ty_setdiff(A,B,"rows",___)
C,ia = ty_setdiff(___;nargout=2)
C,ia = ty_setdiff(A,B,"legacy";nargout=2)
C,ia = ty_setdiff(A,B,"rows","legacy";nargout=2)
# 说明
C = ty_setdiff(A,B) 返回 A 中存在但 B 中不存在的数据,不包含重复项。C 是有序的。
C = ty_setdiff(A,B,setOrder) 以特定顺序返回 C。setOrder 可以是 "sorted" 或 "stable"。
C = ty_setdiff(A,B,___,"rows") 和 C = ty_setdiff(A,B,"rows",___) 将 A 和 B 的每一行都视为单个实体,并返回 A 中存在但 B 中不存在的行,不包括重复项。必须指定 A 和 B,setOrder 是可选的。
C,ia = ty_setdiff(___;nargout=2) 还使用上述任何语法返回索引向量 ia。
通常,C = A[ia]。
如果指定了 "rows" 选项,则 C = A[ia,:]。
C,ia = ty_setdiff(A,B,"legacy") 和 C,ia = ty_setdiff(A,B,"rows","legacy") 通过指定特殊属性来返回数组的特定顺序。
# 示例
集合两个向量的差集
定义都包含某些值的两个向量。
using TyBase
A = [3 6 2 1 5 1 1];
B = [2 4 6];
查找 A 中存在,但 B 中不存在的值。
C = ty_setdiff(A, B)
C =
1×3 Matrix{Int64}:
1 3 5
两个向量的差集以及不同值的索引
定义都包含某些值的两个向量。
using TyBase
A = [3 6 2 1 5 1 1];
B = [2 4 6];
查找 A 中存在,但 B 中不存在的值以及索引向量 ia,以使 C = A[ia]。
C, ia = ty_setdiff(A, B; nargout=2)
C =
1×3 Matrix{Int64}:
1 3 5
ia =
3-element Vector{Int64}:
4
1
5
两个矩阵中的行的差集
定义都包含某些行的两个矩阵。
using TyBase
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 = ty_setdiff(A, B, "rows"; nargout=2)
C =
2×3 Matrix{Int64}:
1 4 5
7 9 7
ia =
2-element Vector{Int64}:
5
1
具有指定输出顺序的两个向量的差集
使用 setOrder 参数指定 C 中值的排序方式。
当 C 中的值的顺序很重要时,指定 "stable" 或 "sorted"。
using TyBase
A = [3 6 2 1 5 1 1];
B = [2 4 6];
C, ia = ty_setdiff(A, B, "stable"; nargout=2)
C =
1×3 Matrix{Int64}:
3 1 5
ia =
3-element Vector{Int64}:
1
4
5
此外,还可以指定 "sorted" 顺序。
C, ia = ty_setdiff(A, B, "sorted"; nargout=2)
C =
1×3 Matrix{Int64}:
1 3 5
ia =
3-element Vector{Int64}:
4
1
5
包含 NaN 的向量的差集
定义两个包含 NaN 的向量。
using TyBase
A = [5 NaN NaN];
B = [5 NaN];
计算 A 和 B 的差集。
C = ty_setdiff(A, B)
C =
1×0 Matrix{Float64}
在Julia中,setdiff 将 NaN 值视为相同的值,所以求 A 和 B 的差集的结果为空。
带有尾随空白的字符串数组
创建字符串数组 A。
using TyBase
A = ["dog", "cat", "fish", "horse"];
创建字符串数组 B,其中某些向量带有尾随空白。
B = ["dog ", "cat", "fish ", "horse"];
查找 A 中存在但 B 中不存在的字符。
C, ia = ty_setdiff(A, B; nargout=2)
C =
2-element Vector{String}:
"dog"
"fish"
ia =
2-element Vector{Int64}:
1
3
setdiff 将字符串数组中的尾随空白视为不同的字符。
字符串数组的差集
创建字符串数组 A。
using TyBase
A = ["cat"; "dog"; "fox"; "pig"];
eltype(A)
ans =
String
创建字符串数组 B。
B = ["dog", "cat", "fish", "horse"];
eltype(B)
ans =
String
查找 A 中存在但 B 中不存在的字符。
C = ty_setdiff(A, B)
C =
2-element Vector{String}:
"fox"
"pig"
结果 C 是字符串数组。
eltype(C)
ans =
String
保留 setdiff 的旧版行为
在代码中使用 "legacy" 标志以保留早期版本中 setdiff 的行为。
计算 A 和 B 的差集并保留当前行为。
using TyBase
A = [3 6 2 1 5 1 1];
B = [2 4 6];
C1, ia1 = ty_setdiff(A, B; nargout=2)
C1 =
1×3 Matrix{Int64}:
1 3 5
ia1 =
3-element Vector{Int64}:
4
1
5
计算 A 和 B 的差集并保留旧版行为。
C2, ia2 = ty_setdiff(A, B, "legacy"; nargout=2)
C2 =
1×3 Matrix{Int64}:
1 3 5
ia2 =
3-element Vector{Int64}:
7
1
5
# 输入参数
A,B - 输入数组数值数组 | 逻辑数组 | 字符数组 | 字符串数组 | 分类数组 | 日期时间数组 | 持续时间数组 | 表 | 时间表
输入数组,指定为数值数组、逻辑数组、字符数组、字符串数组、分类数组、日期时间数组、持续时间数组、表或时间表。如果指定 "rows" 选项,则 A 和 B 的列数必须相同。
A 和 B 必须属于同一类,以下情况例外:
Bool、Char 和所有数值类可以与 Float64 数组合并。
字符串数组可与字符数组或字符串数组合并。
分类数组可与字符数组或字符串数组合并。
根据数据类型,对 A 和 B 还有其他要求:
- 如果 A 和 B 是表或时间表,则必须具有相同的变量名称(顺序除外)。对于表,将忽略行名称,所以值相同而名称不同的两行将被视为相等。对于时间表,将考虑行时间,所以值相同而时间不同的两行将被视为不相等。
A 和 B 还可以是具有以下类方法的对象:
- sort(或 "rows" 选项的 sortrows)
对象类方法彼此之间必须一致。这些对象包括从相同根类导出的异构数组。例如,A 和 B 可以是图形对象的句柄数组。
setOrder - 顺序标志"sorted" (默认) | "stable"
顺序标志以 "sorted" 或 "stable" 指定,指示 C 中值(或行)的顺序。
| 标注 | 说明 |
|---|---|
| "sorted" | 按 ty_sort 返回的排序顺序返回 C 中的值(或行)。 示例 C = ty_setdiff([4 1 3 2 5],[2 1],"sorted") C = 3 4 5 |
| "stable" | 按与 A 中相同的顺序返回 C 中的值(或行)。 示例 C = ty_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 包含该值(或行)第一次出现位置的索引。
# 另请参阅
intersect | ismember | ty_issorted | setxor | ty_sort | union | unique