讲解视频:可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。
MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili
节选自第3章 3.4.1节
mode :计算众数
众数是指一组数据中出现次数最多的数。一组数据可以有多个众数,例如向量[1 3 -1 2 1 3]中,1和3都出现了两次,它们都是这组数据中的众数。
MATLAB中可以使用mode函数计算数据的众数,调用方法也和mean函数类似,但是mode函数可以有多个返回值。
以计算向量A的众数为例,直接调用mode(A)会返回A中出现次数最多的值。如果有多个值以相同的次数出现,mode函数将返回其中最小的值。
如果A是一个矩阵,则mode(A,1)或者mode(A)可以沿着行方向进行计算,得到每一列的众数;mode(A,2)可以沿着列方向进行计算,得到每一行的众数,这里的1和2表示维度dim。
注意:使用mode函数计算众数时会自动忽略NaN值,我们不能额外添加'omitnan'参数,否则会报错。
现在我们来看mode函数有两个返回值的例子,如果A是一个向量,[M,F] = mode(A)得到的M表示向量A的众数,F表示众数M在向量A中出现的次数。
上面这个例子中,有两个众数,分别是0和8,它们出现的次数都是3次,此时MATLAB会返回最小的那个数作为众数。有同学会想,MATLAB能不能把这些众数都输出呢?
当然可以,我们需要用到mode函数的第三个返回值:[M,F,C] = mode(A), 这里的C是一个元胞数组,元胞数组里面有一个列向量,列向量中的每个元素都是向量A的众数。(注意,元胞数组是使用大括号{}括起来的,元胞数组(cell array)里面的元素可以包含不同的数据类型,例如标量、向量、矩阵、字符串等,后面章节中我们会专门讲解元胞数组的用法)
变量C就是元胞数组,它的大小为1×1,即一行一列,因此里面只有一个元素,这个元素是一个2行1列的列向量。我们可以使用大括号索引的方式来提取元胞数组中的元素:
命令C{1}可以提取出元胞数组C中的第一个元素:列向量[0; 8]。这个列向量中的元素0和8都是向量A的众数。
以上是A为向量时的情况,如果A是一个矩阵,mode函数也可以有两个返回值或三个返回值,后两个返回值代表的含义与A为向量时类似。我们直接看下面的例子:
M是一个包含四个元素的行向量,里面第k个元素表示第k列的众数,例如第1列的众数为0;如果有多个众数,那么会返回最小的那个值,因此第2列返回的众数为0。
F也是一个包含四个元素的行向量,它表示M中的各个众数在其所在列中出现的次数,例如第1列的众数0在第1列出现了2次。
C是一个大小为1×4的元胞数组,里面的第k个元素表示第k列的所有众数。从元胞数组C的结果来看,第一个和第四个元素分别为0和4,这说明第1列和第4列都只有一个众数,分别是0和4;C中第二个元素是一个4行1列的列向量,这说明第2列有四个众数;C中第三个元素是一个2行1列的列向量,这说明第3列有两个众数。
我们可以使用大括号索引提取C中的每个元素:
类似的,我们也可以计算A矩阵每一行的所有众数,结果如下:
下面对mode函数做一个总结:
(1) mode函数可用来计算一个向量或者矩阵中的众数。如果mode函数只有一个返回值,那么它的用法和mean函数、median函数类似。
(2) 如果A是一个向量,那么M = mode(A)可以计算向量A的众数,若存在多个众数,则只会返回其中的最小值。
(3) 如果A是一个矩阵,那么M = mode(A, dim)可以计算矩阵A沿着维度dim中所有元素的众数。当dim=1时沿着行方向进行计算,即得到每列的众数;当dim=2时沿着列方向进行计算,即得到每行的众数。另外,mode(A,1)可以简写成mode(A)。
(4) mode函数不能使用'omitnan'参数,MATLAB在计算众数时会自动忽略向量或者矩阵中的NaN值。
(5) mode函数最多能有三个返回值:[M,F,C] = mode(A). 如果A是向量,那么M表示向量A的众数,F表示众数M在向量A中出现的次数,如果A中存在多个众数,MATLAB会返回最小的那个数作为M,第三个返回值C则是一个元胞数组,里面包含了A的所有众数。如果A是矩阵,那么M、F和C分别代表每一列的众数、每一列众数在所在列中出现的次数以及每一列的所有众数构成的元胞数组。
另外,本小节用到了元胞数组的知识,元胞数组中的元素用大括号{}括起来,各元素可以是不同的数据类型,要提取元胞数组中的元素可以使用大括号进行索引,例如,要提取元胞数组C中的第一个元素,可以使用C{1}。未来章节我们会系统学习元胞数组的用法,感兴趣的同学可以提前在MATLAB官网搜索关键词进行学习。