# 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