集合是指具有某种特定性质的具体的或抽象的对象汇总而成的集体。其中,构成集合的这些对象则称为该集合的元素。集合中的元素具有三个性质:确定性(给定一个集合,任给一个元素,都可以确定该元素是否属于该集合)、互异性(任何两个元素都是不相同的)和无序性(每个元素的地位都是相同的,元素之间是没有顺序的)。
学过Python的同学应该知道,Python中可以使用set函数或者大括号来创建集合。然而在现版本的MATLAB中,还没有正式推出集合这个数据结构。目前MATLAB使用普通的数组来模拟集合的功能,但大家要清楚,数组中的元素可以相同而且是有先后顺序的,因此不满足集合中元素的互异性和无序性,因此数组并不能当成真正的集合。MATLAB官网列举了一些集合运算相关的函数,官方是这样介绍集合运算的:集合运算比较两个集合中的元素,以找出共性或差异。大家一定要注意,官方所说的集合要当作普通的数组来理解,用户可以通过MATLAB提供的与集合运算相关的函数来实现集合中的大多数操作。
我们先通过表格来展示这一小节要学到的和集合运算相关的函数:
(1)unique函数
unique函数可用来提取数组中的唯一值,它可以用在我们学过的向量和矩阵上,也可以用在我们后续章节要学的表格类型的数据上。
先以向量为例,unique函数的用法如下:
如果A是一个向量,C = unique(A) 会对向量A进行去重操作,即提取向量A的唯一值。返回的向量C和输入的向量A的方向相同,向量C的每一个元素都来自向量A且互不相同,同时,MATLAB会自动将C中元素升序排列。(显然,numel(A)≥numel(C)对任意的A都成立)
另外,unique函数可以有最多三个返回值:[C,ia,ic] = unique(A),这里的ia和ic都是索引向量,ia是C中的每个元素在A中的索引值,ic是A中的每个元素在C中的索引值。因此有下面的等式成立:A(ia)等于C 且 C(ic)等于A。
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中的值。
unique函数还可以作用到矩阵上,它的用法如下:
如果A是一个矩阵,那么unique(A)的结果和unique(A(:))的结果相同。但是,如果我们加一个输入参数'rows',那么unique(A, 'rows')会将A的每一行视为一个整体,会返回A矩阵的唯一行。注意,MATLAB默认会对唯一行进行排序,排序规则如下:优先按照第一列元素升序排列,第一列元素相同时,会按第二列元素升序排列,依此类推。当然,如果你希望按照与A中相同的顺序返回唯一值,则可以在输入的最后加一个参数'stable'。
unique函数用于矩阵上时,也可以有最多三个返回值,但这种情况我们用的非常少,感兴趣的同学可以在MATLAB中进行测试。
(2)ismember函数
h = ismember(A, B)可以判断数组A中的元素是否在数组B中,返回值h是一个和A大小相同的逻辑数组,逻辑数组h中的元素为逻辑值1时说明该位置的A元素在B中存在,为逻辑值0时说明在B中不存在。
ismember函数可以有两个返回值:[h, ib] = ismember(A,B)。 h就是上面的那个逻辑数组。ib是和A大小相同的一个数组,对于 A 中属于 B 的成员的每一个值,ib 会包含该值在 B 中的最小索引;如果值为 0 表示 A 不是 B 的成员。
如果B和A的列数相同,那么我们可以在ismember函数的输入最后增加一个参数'rows',这时候ismember(A, B, 'rows')会将A的每一行视为一个整体,然后在B中查找。
(3)intersect、union、setdiff和setxor函数
这四个函数分别用于计算两个数组之间的交集、并集、差集和对称差集,下面给出了这四个函数对应的维恩图(Venn diagram)。
因为这四个函数的用法类似,所以下面以intersect函数为例,我们介绍它的用法。
C = intersect(A,B)会返回数组A和B的共同数据,但是不包含重复项,返回的C默认会排序。我们还可以增加一个输入参数'stable',这样会按照在A中出现的顺序返回C中的值。
如果A和B的列数相同,那么我们可以加一个输入参数'rows',这时候intersect (A, B, 'rows')会将A和B的每一行视为一个整体,然后返回A和B共同的行。注意,MATLAB默认会对共同的行进行排序,排序规则如下:优先按照第一列元素升序排列,第一列元素相同时,会按第二列元素的升序排列,依此类推。当然,如果你希望按照与A中相同的顺序返回唯一值,则可以在输入的最后加一个参数'stable'。
另外,intersect函数可以有最多三个返回值,下面截图来自MATLAB官网:
通常情况下我们不会用到三个返回值,感兴趣的可以在MATLAB中进行测试。
剩余三个函数的用法我们举几个简单的例子
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删