集合是指具有某种特定性质的具体的或抽象的对象汇总而成的集体。其中, 构成集合的这 些对象则称为该集合的元素。集合中的元素具有三个性质: 确定性(给定一个集合, 任给一个 元素,都可以确定该元素是否属于该集合)、互异性(任何两个元素都是不相同的)和无序性 (每个元素的地位都是相同的,元素之间是没有顺序的)。
学过 Python 的同学应该知道, Python 中可以使用 set 函数或者大括号来创建集合。然而在 现版本的 MATLAB 中,还没有正式推出集合这个数据结构。目前 MATLAB 使用普通的数组 来模拟集合的功能, 但大家要清楚,数组中的元素可以相同而且是有先后顺序的, 因此不满足 集合中元素的互异性和无序性,因此数组并不能当成真正的集合。 MATLAB  官网列举了一些 集合运算相关的函数, 官方是这样介绍集合运算的: 集合运算比较两个集合中的元素, 以找出共性或差异。大家一定要注意,官方所说的集合要当作普通的数组来理解,用户可以通过 MATLAB 提供的与集合运算相关的函数来实现集合中的大多数操作。
我们先通过表格来展示这一小节要学到的和集合运算相关的函数:
函数名
功能
unique
返回数组中的唯一值
ismember
判断一个数组的元素是否在另一个数组内
intersect
返回两个数组的交集
union
返回两个数组的并集
setdiff
返回两个数组的差集
setxor
返回两个数组的对称差集

1unique 函数

unique 函数可用来提取数组中的唯一值, 它可以用在我们学过的向量和矩阵上, 也可以用在我们后续章节要学的表格类型的数据上。
先以向量为例, unique 函数的用法如下:
如果 A 是一个向量, C = unique(A) 会对向量 A 进行去重操作,即提取向量 A 的唯一值。 返回的向量 C 和输入的向量 A 的方向相同, 向量 C 的每一个元素都来自向量 A 且互不相同, 同 时, MATLAB 会自动将 C 中元素升序排列。 (显然, numel(A)≥numel(C)对任意的 A 都成立)
notion image
另外, unique 函数可以有最多三个返回值: [C,ia,ic] = unique(A),这里的 ia 和 ic 都 是索引向量, ia 是 C 中的每个元素在 A 中的索引值, ic 是 A 中的每个元素在 C 中的索引值。 因此有下面的等式成立: A(ia)等于 C 且 C(ic)等于 A。
notion image
C = [-6 -3 5 8 10]  是 A 中的唯一值;
ia = [2;7;1;5;4]  是一个列向量:第一个元素 2 代表的含义是 C 中第一个元素-6 在 A 中的 索引值是 2(A 中有两个-6 ,MATLAB 会返回第一个-6 的索引);第二个元素是 7,表示 C 中 第二个元素-3 在 A 中的索引值是 7;第三个元素是 1,表示 C 中第三个元素 5 在 A 中的索引 值是 1;依此类推。
ic = [3;1;3;5;4;1;2;2]也是一个列向量:第一个元素 3 代表的含义是 A 中第一个元素 5 在 C 中的索引值是 3;第二个元素 1 代表的含义是 A 中第二个元素-6 在 C 中的索引值是 1;依此类 推。
上面得到的唯一值向量 C 都会自动进行升序排列,如果我们不希望 MATLAB 自动排序,可 以在 unique 函数的输入最后增加一个参数'stable',这样 MATLAB 会按照与 A 中相同的顺序 返回 C 中的值。
命令                          
 结果
A = [5 -6 5 10 8 -6 -3 -3]; C = unique(A, 'stable')
C = 5        -6         10           8         -3
unique 函数还可以作用到矩阵上,它的用法如下:
如果 A 是一个矩阵, 那么 unique(A)的结果和 unique(A(:))的结果相同。但是, 如果我们 加一个输入参数'rows',那么 unique(A, 'rows')会将 A 的每一行视为一个整体, 会返回 A 矩 阵的唯一行。注意, MATLAB 默认会对唯一行进行排序, 排序规则如下: 优先按照第一列元素升 序排列, 第一列元素相同时, 会按第二列元素升序排列, 依此类推。当然, 如果你希望按照与 A 中相同的顺序返回唯一值,则可以在输入的最后加一个参数'stable'。
notion image
unique 函数用于矩阵上时, 也可以有最多三个返回值, 但这种情况我们用的非常少, 感兴趣的同学可以在 MATLAB 中进行测试。

2ismember 函数

h = ismember(A, B)可以判断数组 A 中的元素是否在数组 B 中,返回值 h 是一个和 A 大 小相同的逻辑数组, 逻辑数组 h 中的元素为逻辑值 1 时说明该位置的 A 元素在 B 中存在, 为逻 辑值 0 时说明在 B 中不存在。
notion image
ismember 函数可以有两个返回值: [h, ib] = ismember(A,B)。 h 就是上面的那个逻辑数
组。 ib 是和 A 大小相同的一个数组, 对于 A 中属于 B 的成员的每一个值, ib 会包含该值在 B 中的最小索引;如果值为 0 表示 A 不是 B 的成员。
notion image
如果 B 和A 的列数相同,那么我们可以在 ismember 函数的输入最后增加一个参数'rows', 这时候 ismember(A, B, 'rows')会将 A 的每一行视为一个整体,然后在 B 中查找。
notion image

例题
notion image
notion image
思考:如果不要求顺序相同,只要求数字相同就能中奖,代码应该怎么写?

3intersect union setdiff 和 setxor 函数

这四个函数分别用于计算两个数组之间的交集、并集、差集和对称差集, 下面给出了这四 个函数对应的维恩图(Venn diagram)。
notion image
因为这四个函数的用法类似,所以下面以 intersect 函数为例,我们介绍它的用法。
C = intersect(A,B)会返回数组 A 和 B 的共同数据, 但是不包含重复项, 返回的 C 默认会 排序。我们还可以增加一个输入参数'stable',这样会按照在 A 中出现的顺序返回 C 中的值。
notion image
如果 A 和 B 的列数相同, 那么我们可以加一个输入参数'rows',这时候 intersect (A, B, 'rows')会将 A 和 B 的每一行视为一个整体, 然后返回 A 和 B 共同的行。注意, MATLAB 默认会 对共同的行进行排序, 排序规则如下: 优先按照第一列元素升序排列, 第一列元素相同时, 会 按第二列元素的升序排列,依此类推。当然,如果你希望按照与 A 中相同的顺序返回唯一值, 则可以在输入的最后加一个参数'stable'。
notion image
另外, intersect 函数可以有最多三个返回值,下面截图来自 MATLAB 官网:
notion image
通常情况下我们不会用到三个返回值,感兴趣的同学可以在 MATLAB 中进行测试。
剩余三个函数的用法我们举几个简单的例子, 更多例子大家可以自己查看帮助文档学习。
notion image

Loading...
公告
🎉大学生科技协会(2024)网站试运行🎉
-- 感谢您的支持 --- 科协获:
小平科技创新团队 (青少年科技创新领域国家级最高荣誉,全校唯一)
全国高校百强社团 中国大学生ican物联网创新创业实践教育基地 校十佳社团 “一院一品”智能空间 科技竞赛优秀组织单位
阅读科协简介了解更多吧!