在讲解第三章课后习题的过程中, 我给大家拓展了一些讲义中没有介绍的新函数, 本文 将对这些新函数进行总结,方便大家学习。
第三章课后习题的讲解视频:
下面表格中列举了这些函数的名称和功能,上方的讲解视频中也有介绍这些函数的使用 方法,大家可以找到对应题目的讲解视频进行学习。另外,表中最后一列给出了各个函数的 重要性, 大家需要重点掌握重要性大于等于四颗星的函数,它们在后续的章节中可能会频繁 使用;重要性小于等于三颗星的函数大家了解即可,它们用的频率不高。
目录
(1)isempty 函数(★★★★☆)(2)unifrnd 函数(★★★☆☆)(3)normrnd 函数(★★☆☆☆)(4)fibonacci 函数(★☆☆☆☆)(5)factorial 函数(★★★☆☆)(6)randperm 函数(★★★★★)(7)randsample 函数(★★★☆☆)(8)datasample 函数(★★☆☆☆)(9)ismembertol 函数(★★☆☆☆)(10)uniquetol 函数(★★☆☆☆)(11)prctile 函数(★★★☆☆)(12)meshgrid 函数(★★★★☆)(13)rng 函数(★★★★★)(14)poissrnd 函数(★★☆☆☆)(15)exprnd 函数(★★☆☆☆)(16)nchoosek 函数(★★★☆☆)(17)perms 函数(★★★☆☆)
(1)isempty 函数(★★★★☆)
如果A 为空数组 [ ] , isempty(A) 返回逻辑值 1 (true),否则返回逻辑值 0 (false)。
下面举个应用 isempty 函数的例子: 假设我们想判断常数 x 是否是数组 A 中的某个元素, 如果是则返回逻辑值 1,不是则返回逻辑值 0 。我们可以使用下面两种方法:
解释: find 函数可以查找非零元素的索引,如果数组中所有的元素均为 0,那么 find 函 数返回空向量[ ] 。因为 A 中所有的元素和 x 都不相等,所以 A==x 返回一个元素全为逻辑值 0 的逻辑向量, 此时 find(A==x, 1)返回空向量[ ] ,因此 isempty(find(A==x, 1))会返回逻辑值 1, 我们对这个结果进行逻辑非~运算, 就会返回逻辑值 0,即 x 不是 A 中的某个元素。
拓展:如果 A 是一个数组,那么命令 length(A) == 0 的返回结果和 isempty(A)的返回结果 一样, MATLAB 推荐大家使用后者判断 A 是否为空数组[ ] ,后者的运行效率更高。
(2)unifrnd 函数(★★★☆☆)
unifrnd 函数可以生成任意区间内均匀分布的随机数,该函数需要统计和机器学习工具箱 Statistics and Machine Learning Toolbox。
拓展:a + (b − a) * rand(m, n)等价于unifrnd(a, b, [m, n])或unifrnd(a, b, m, n).
(3)normrnd 函数(★★☆☆☆)
normrnd 函数可以生成正态分布的随机数,该函数需要统计和机器学习工具箱 Statistics and Machine Learning Toolbox 。(注意: randn 只能生成标准正态分布的随机数)
拓展:p + q ∗ randn(m, n)等价于normrnd(p, q, [m, n])或normrnd(p, q, m, n).
(4)fibonacci 函数(★☆☆☆☆)
(5)factorial 函数(★★★☆☆)
factorial 函数用于计算阶乘,如果 n 是一个正整数,那么 factorial(n)就是计算 n!。 例如我们计算 3 的阶乘和 10 的阶乘:
拓展: n 为正整数时, 命令 prod(1:n)也可以计算 n 的阶乘。
(6)randperm 函数(★★★★★)
randperm 函数是一个非常有用的函数,它能够将一个数字序列进行随机打乱。它有两种 主要的使用方法:
用法 1:randperm(n)可以将向量 1:n 中元素的顺序随机打乱,生成一个长度仍为 n 的新向 量,因此所有可能出现的情况共 n!种(全排列)。例如,当你运行 randperm(4)时,你可能得 到[1 4 3 2],也可能得到[3 2 4 1]。
用法 2:randperm(n,k)表示从打乱的 1:n 序列中随机的选择 k 个数出来,显然这 k 个数都 不相同,且 k 要小于等于 n 。例如,当你运行 randperm(10,3)时,你可能得到[5 3 10],也可能 得到[6 1 8]。
randperm 函数在实际的场景中应用的非常广泛, 第三章课后练习挑战篇中的第五题举了 几个例子, 大家一定要看本讲义最上方的作业讲解视频学习。
(1) 模拟商品推销员访问城市(旅行商问题、 TSP)
(2) 模拟课堂上随机选取同学答题
(3) 模拟抽奖能获得多少金额
(4) 模拟斗地主游戏为地主和农民发牌
注意: randperm(n,k)和 randi(n,k,1)的区别在于:randperm 相当于无放回的抽样,而 randi 相当于有放回的抽样。因此,randperm 函数返回的结果中的各元素都不相同,而 randi 函数返 回的结果中的各元素可能相同。
拓展: 对 randperm 函数背后原理感兴趣的同学可以自行搜索 Fisher –Yates shuffle 算法 (洗牌算法)。
(7)randsample 函数(★★★☆☆)
rand 取自单词 random,翻译成中文表示随机;单词 sample 翻译成中文表示样本, 因此根 据字面意思理解 randsample 函数用于生成随机样本,它是 randperm 函数的进阶版本,该函数 需要统计和机器学习工具箱 Statistics and Machine Learning Toolbox。
下面我们介绍它的主要用法:
(1)y = randsample(n,k) 返回从整数 1 到 n 中无放回随机均匀抽取的 k 个值。
y = randsample(n, k)等价于 y = randperm(n, k),只不过 randsample 返回的是列向量, randperm 返回的是行向量。
(2)y = randsample(n,k,true) 返回从整数 1 到 n 中有放回随机均匀抽取的 k 个值。 y = randsample(n, k, true) 等价于 y = randi(n, k, 1)。
(3)y = randsample(population,k) 返回一个向量, 其中包含从向量 population 的 值中无放回随机均匀抽取的 k 个值。
(4 ) y = randsample(population,k,true) 返 回 一 个 向 量 , 其 中 包 含 从 向 量 population 的值中有放回随机均匀抽取的 k 个值。
(5)y = randsample(n,k,true,w) 使用长度为 n 的非负权重向量 w 来确定整数 i 被 选为 y 的元素的概率(这里一定是有放回的抽样,因此第三个输入参数只能为 true)。
以下是权重向量 w 的介绍:
(6)y = randsample(population,k,true,w)使用与向量 population 长度相同的非负 权重向量 w 来确定值 population(i) 被选为 y 的元素的概率(这里一定是有放回的抽样, 因此第三个输入参数只能为 true)。
(8)datasample 函数(★★☆☆☆)
datasample 函数是 randsample 函数的进阶版,和 randsample 函数相比,datasample 函数还 可以随机抽取矩阵的行或者列。 函数可以设置是有放回还是无放回的抽取,也能指定权重。
下面我们通过代码了解 datasample 函数常见的用法:
dim 等于 1 时,表示沿着行方向进行随机抽取,此时得到的是随机的行; dim 等于 2 则表 示沿着列方向进行随机抽取,此时得到的是随机的列;另外,输入参数 'Replace' 后面的 false 表示无放回的随机抽样, true 则表示有放回的随机抽样。
当然,我们也可以使用 randsample 函数来实现随机抽取矩阵的行或者列,只需要随机生 成行或列的下标索引即可。 因此 datasample 函数可以由 randsample 函数代替。
(9)ismembertol 函数(★★☆☆☆)
ismembertol 函数和 ismember 函数的功能类似,它在比较元素是否相等时考虑了一定的 容差。
我们可以看官网这个例子:
(10)uniquetol 函数(★★☆☆☆)
uniquetol 函数和 unique 函数的功能类似,它在比较元素是否相等时考虑了一定的容差。
我们可以看官网这个例子:
(11)prctile 函数(★★★☆☆)
prctile 函数可计算百分位数。百分位数(percentile)是统计学术语,若将一组数据从小 到大排序,并计算相应的累计百分点,则某百分点所对应数据的值就称为这个百分点对应的 百分位数。你可以认为将一组数据升序排列后,处于k%位置的数就是这组数据的第k百分位 数,我们记为。
例如,大家熟悉的中位数就是排序后处于中间位置的数,因此中位数也被称为第 50 百分 位数,我们可以记为 ,有时也记为 .
下四分位数则是位于排序后的数据 25%位置上的数,我们用 Q1 表示;上四分位数 则是处在排序后的数据 75%位置上的数,我们用 Q3 表示。
下面我们来看 prctile 函数的使用方法:
(1)Y = prctile(X,p) 根据区间 [0,100] 中的百分比 p 返回数据向量或数组 X 中元 素的百分位数。
- 如果 X 是向量,则 Y 是标量或向量, 向量长度等于所请求百分位数的个数 (length(p)) 。Y(i) 包含第 p(i) 个百分位数。
- 如果 X 是矩阵,则 Y 是行向量或矩阵, 其中 Y 的行数等于所请求百分位数的个数 (length(p)) 。Y 的第 i 行包含 X 的每一列的第 p(i) 个百分位数。
(2)Y = prctile(X,p,dim) 返回运算维度 dim 上的百分位数。
如果 X 是一个矩阵,那么 dim 等于 1 时表示沿着行方向进行计算,得到每一列元素的百 分位数;dim 等于 2 时表示沿着列方向进行计算,得到每一行元素的百分位数。
(12)meshgrid 函数(★★★★☆)
meshgrid 函数可以基于向量 x 和 y 中包含的坐标来返回二维网格坐标。
举个具体的例子帮助大家理解:假设 x 轴坐标上的取值是[0 1 2 3 4] ,y 轴坐标上的取值 是[0 1 2 3],现在请使用 x 轴坐标和 y 轴坐标共同创建下图所示的二维网格坐标:
分析: x 轴坐标上的取值有 5 种, y 轴坐标上的取值有 4 种, 将取值进行组合有 20 种, 因此上方左图有 20 个交点,每个交点对应一个网格坐标。如果指定交点的排列顺序为沿着 x 轴的正方向和 y 轴的正方向,这样就能表示这 20 个交点的网格坐标,结果在上方右图中。
在 MATLAB 中,会将点的坐标(x, y)拆分成横坐标矩阵和纵坐标矩阵分别保存,我们可 以使用 meshgrid 函数得到这两个矩阵:
进一步地, 如果我们想在这 20 个交点构成的二维网格上计算二元函数 的值,我们可以使用下面的代码:
另外,如果我们只给 meshgrid 函数一个输入变量,那么命令[X,Y] = meshgrid(x) 得到的 结果和 [X,Y] = meshgrid(x,x)得到的结果完全相同。
事实上 meshgrid 函数在三维图的绘制中用的比较多,我们先给大家看个例子, 后续章节 中会系统讲解三维图的绘制方法。
绘制在x和y都位于区间[ − 1, 1]上的图形。
(13)rng 函数(★★★★★)
rng 函数可用来设置随机数种子,这样能生成可重复的随机数。
使用随机数生成函数(例如 rand, randi 等)之前,使用 rng(seed)命令设置随机数种子,这样 能保证生成的随机数被固定下来。设置不同的随机数种子生成的随机数通常都不相同。
拓展: 每次重新启动 MATLAB 时,随机数生成器均复位到相同的状态,这样使用生成 随机数的命令会返回相同的结果。 我们可以使用 rng('shuffle') 命令,它可以根据当前的时间 使用不同的种子重新设定生成器的种子,这样能避免重复生成相同的随机数。
(14)poissrnd 函数(★★☆☆☆)
poissrnd 函数用于生成泊松分布的随机数,该函数需要统计和机器学习工具箱 Statistics and Machine Learning Toolbox。
设随机变量X 所有可能的取值为。,12,… ,而取各个值的概率为:
其中入>0 是常数,则称随机变量X 服从参数为的泊松分布,可以证明:参数为入 的泊 松分布的期望和方差均为入.
泊松分布适合于描述单位时间内随机事件发生的次数,参数入就是单位时间内随机事件 的平均发生次数,有时也被称为事件发生的速率。
例子:假设某商店每天的客流量服从入=300 的泊松分布,请模拟这个商店最近一个月
每天的客流量,并计算均值和方差。
(15)exprnd 函数(★★☆☆☆)
exprnd 函数用来生成指数分布的随机数,该函数需要统计和机器学习工具箱 Statistics and Machine Learning Toolbox。
其中 θ>0 为常数,则称X 服从参数为 θ 的指数分布。
若X 服从参数为 θ 的指数分布,则记为X~EXP(θ),可以证明 X 的期望为 θ ,方差为.
如果使用随机变量X 表示一件物品的寿命,例如灯泡的使用寿命,那么θ 的含义可以代 表平均寿命。
例子: 假设某工厂生产的二极管的使用寿命服从均值为 2000 小时的指数分布,请随机生 成 1000 个二极管的使用寿命,并计算均值和方差 (结果请四舍五入)。
拓展: 有些教材也使用下面的概率密度函数定义指数分布:
这种定义方法和上面的定义方法是等价的,此时
(16)nchoosek 函数(★★★☆☆)
nchoosek 函数主要用来计算组合数,也能返回从向量 v 中抽取 k 个元素的所有组合。
下面是 nchoosek 函数的第二种用法: 返回从向量 v 中抽取 k 个元素的所有组合。
(17)perms 函数(★★★☆☆)
perms 函数可用来返回向量 v 中各元素所有可能的排列情况。
拓展:(1)如果 v 中有 k 个元素,那么返回的矩阵的行数为 k 的阶乘;
(2)randperm(n) 得到的结果实际上就是从 perms(1:n)返回的矩阵中随机的抽取一行。