MATLAB课程第3章的练习题:MATLAB小白到高手的必刷题

 讲解视频:可以在bilibili搜索“MATLAB教程新手入门篇——数学建模清风主讲”。

MATLAB教程新手入门篇(数学建模清风主讲,适合零基础同学观看)_哔哩哔哩_bilibili


本章涵盖了MATLAB中许多常用的内置函数。为了加深理解,我专门设计了一些题目,分为三个部分来帮助大家巩固和掌握本章的知识(不要使用循环、判断等本章没学的命令)

  • 基础篇帮助大家再次复习基础的内容,题目的答案大部分都能直接在本章的知识点中找到。

  • 提高篇在本章课上练习题的基础上进行了一点变形,考验大家对于知识点的熟练程度。这部分的习题不算难,相信大多数的同学都能应对得了。

  • 挑战篇这部分的习题有一定的难度,主要训练大家的编程思维。这部分的习题如果你能独立地做出来,那就说明你非常有编程天赋,大家可以尝试挑战一下。

参考答案在本文的最后,有题目的讲解视频。


《基础篇》

Q1. 填空题

(1)MATLAB中矩阵的元素应包括在                      括号中,矩阵的同行元素之间用                        分隔,行与行之间用                      分隔。 

(2)命令0:3:10生成的向量是                       ;命令10:-2: 5生成的向量是                      ;命令10: 5生成的向量是                      

(3)A是一个向量,要计算A中包含的元素个数,使用的命令是                      ;如果A是一个矩阵,要计算A中包含的元素个数的命令是                       。

(4)A是一个矩阵,命令                      可返回A的行数;命令                      可返回A的列数。

(5)要生成一个包含50个元素的等差数列,数列的第一个数是0,最后一个数是2π,我们可以使用命令                        。

(6)提取向量A中第三个位置的元素到最后一个位置的元素,可以使用命令                       ;提取向量A第三个位置的元素到倒数第二个位置的元素可以使用命令                       。

(7)提取矩阵A中奇数行的元素可以使用命令                      

(8)删除A矩阵的第二列和最后一列可以使用命令                       。

(9)A矩阵的大小为3×3,其线性索引为4的元素位于第                      行第                      列,如何使用代码得到这个结果:                       。

(10)命令                      可以将矩阵A中的所有元素按照线性索引的方式重构成一个列向量。

(11)命令                      可以生成一个大小为3×4的全为0的矩阵;                      可以生成一个大小为4×4的全为1的矩阵;                      可以生成一个大小为3×3的单位矩阵。

(12)命令                       用来创建一个100行2列的随机矩阵,矩阵中的每个元素都在区间0和1内均匀分布。

(13)要模拟投掷有6个面的均匀骰子100次,那么我们可以使用命令                      得到一个长度为100的行向量,向量中的每个元素都是随机的取自[1,6]中的整数。

(14)命令                      用来创建一个3行3列的随机矩阵,矩阵中的每个元素都随机取样自标准正态分布。

(15)如果A是一个向量,那么命令diag(A)的作用是                       ;如果A是矩阵,则作用是                              

(16)如果矩阵A和B的行数相同,命令                      可以对A和B横向拼接;如果矩阵A和B的列数相同,命令                       可以对A和B纵向拼接。

(17)命令repelem(1:3,1:3)得到的结果是                      

(18)将一个向量a沿着行方向进行重复的堆叠5次,可以使用命令                        。

(19)矩阵A大小是4行5列,将其形状变成2行10列可以使用命令                      

(20)命令                      可以将矩阵A进行左右翻转,命令                      可以将A上下翻转。

(21)要将矩阵A顺时针(注意不是逆时针)旋转90度可以使用命令                      

(22)将向量v按照从大到小的顺序进行降序排列可以使用命令                        。

(23)计算A矩阵每一行的最大值的命令为                      

(24)计算累积和、乘积、差分的函数分别是                       。

(25)A是一个方阵,A^3的作用是                      ,A.^3的作用是                      

(26)MATLAB中关系运算符有六个,分别是                         。

(27)运算优先级非常重要,我们可以通过                      来改变运算的先后顺序。

(28)要返回数组中出现的唯一值,我们可以使用函数                          。

(29)判断一个数组的元素是否在另一个数组内,我们可以使用函数                         。

(30)要计算方阵A的特征值和特征向量,命令为                      

(31)交集、并集、差集和对称差集的四个函数分别为                         。

(32)返回矩阵的上三角部分和下三角部分的函数分别为                        。

(33)将一个普通数组转换成逻辑值数组的函数是                       

(34)判断数组中的元素是否为不定值NaN的函数是                      

(35)计算方阵A的逆矩阵的命令为                      

(36)对A矩阵的所有元素求倒数的命令为                       。

(37)命令0 == 0 == 0返回的结果为                 ;命令-1 < 0 < 1返回的结果为               。  

(38)xor(3,4)返回的结果为                       。

(39)计算矩阵的行列式、秩和迹的函数分别为                      

(40)计算向量x的1-范数、2-范数和p-范数的命令为                      


Q2. 请完成下面的一系列任务

(1)生成一个6行3列的随机矩阵A,矩阵中每个元素都是位于区间[50,100]之间的随机整数,下面我们假设矩阵A的每一行代表一名学生,这六名同学的三门科目的成绩对应着三列;

(2)将第一门科目六名同学的成绩赋值给变量B,对B进行降序排列,排序后的向量记为BB,并返回BB中的每个元素在B中的索引向量ind;

(3)计算A中所有成绩的自然对数;

(4)请基于第二科的成绩按升序对这六名同学进行排序,当第二科成绩相同时,请保持其在矩阵中出现的先后顺序;

(5)计算六名同学的总分以及每门科目的平均分;

(6)计算每门科目的最低分,并返回是第几位同学取得的分数;

(7)计算每名同学在哪门科目上分数最高、并返回最高分;

(8)假设这三门科目的权重分别是0.2, 0.5, 0.3,请计算每名同学的加权平均分(即三门科目的成绩分别乘以对应的权重,然后再求和);

(9)判断这三门科目是否有同学不及格(低于60分),如果有任意一名同学在某个科目中不及格就返回逻辑值1,否则返回逻辑值0;

(10)统计每门科目不及格的人数;

(11)将A中低于60分的成绩全部改成60分;

(12)在上一问的基础上重新计算六名同学的总分,并找出总分最高的同学。

 

Q3. 简答题

(1)如何将一个向量倒序?例如原来的向量是[1 5 8 4],倒序后是[4 8 5 1]。原向量的方向(行向量和列向量)会影响你的结果吗?(本题答案有至少两种方法)

(2)请说明&&和&的用法和主要区别。

(3)MATLAB中浮点数的计算可能存在误差,应该怎样判断两个浮点数相等?

(4)简述MATLAB中*和.*的作用,并介绍加法运算中所支持的几种兼容模式。

(5)简述sum、mean、median这三个函数使用方法的共同特点,它们和max函数在沿行和列方向计算时的命令有什么区别?

提高篇

Q1.如果x是一个常数,A是一个矩阵,请给出至少两种方法来判断A矩阵中是否存在x?存在则返回逻辑值1,否则返回逻辑值0.

 

Q2.生成包含3个元素的行向量A,A中每个元素都是位于1-10之间的随机整数;再生成包含10个的元素的行向量B,B中的每个元素也都是位于1-10之间的随机整数。

(1)A中的这三个元素哪些出现在B中?请返回下表中的结果列。例如:

 

(2)A中每个元素是否都包含在B中? 请返回下表中的结果列。例如:

Q3.如何创建一个包含n个元素的等比数列,其第一项为a,最后一项为b。例如a=2, b=1024, n=10时,创建的等比数列为:[2 4 8 16 32 64 128 256 512 1024].

 

Q4.命令rand(1)可生成一个位于0和1之间均匀分布的随机数,那么10*rand(1)生成的随机数所在的范围是                        之间;2+3*rand(1)生成的随机数所在的范围是                        之间?考虑一般情况,命令                                    可以创建一个m行n列的随机矩阵,矩阵中的每个元素都在区间[a, b]上( a<b )均匀分布。

Q5.本题需要用到概率论中正态分布的一个性质:假设X~N(u,σ^2 ),且a,b是两个实数,那么aX+b~N(au+b,(aσ)^2 ),MATLAB中的            函数可生成标准正态分布的随机数,其均值为0方差为1。利用上面的性质,命令                                  可以创建一个m行n列的随机矩阵,矩阵中的每个元素都服从均值为p,方差为q^2的正态分布。


Q6.A是一个包含至少两个元素的向量,请你判断A中是否所有元素都互不相同。例如:A = [6 5 0 3 6 2]时返回逻辑值0,因为里面包含了重复的元素6;A = [1 2 0 4 -2 3 7]时返回逻辑值1,因为所有的元素都互不相同。(你能给出两种甚至更多种解答方法吗?)

Q7.找到向量x中最大值对应的位置的索引,如果有多个最大值,将它们的索引全部返回。例如x = [2 4 8 1 4 8 3],那么你需要返回[3, 6],因为第3个位置和第6个位置都是最大值8。

Q8.给出一个实矩阵A,请判断A是否为对称矩阵。(实矩阵是指矩阵中的每一个元素都是实数,不含复数;若A和A的转置相同,则A为对称矩阵)

Q9.给定两个同型方阵A和B,请判断A和B是否互为对方的逆矩阵。(提示:如果A*B或者B*A的结果是单位矩阵,则A和B互逆)

Q10.对于任意一个实对称矩阵A,判断A是否为正定矩阵。(提示:如果实对称矩阵A的所有特征值都大于0,那么这个实对称矩阵是正定矩阵)

Q11.怎样将一个方阵A的主对角线元素重新赋值为0。例如:

 

Q12.下面是斐波那契数列的通项公式,请使用该通项公式计算n=1,2,…,10的前10项。

a_n=\frac{1}{\sqrt{5}}\left[ \left( \frac{1+\sqrt{5}}{2} \right) ^n-\left( \frac{1-\sqrt{5}}{2} \right) ^n \right]

Q13. 拉马努金是印度历史上最著名的数学家之一,他没有接受过正规的数学教育,但有着令人惊异的数学天赋,似乎可以感知到大量数字关系背后的规律。请你验证他发现的下面两个等式是否成立(考虑浮点数计算的误差)。

(1)\sqrt{\sqrt[3]{28}-3}=\frac{\sqrt[3]{98}-\sqrt[3]{28}-1}{3}

(2)-\sqrt[3]{\cos \left( \frac{\pi}{9} \right)}+\sqrt[3]{\cos \left( \frac{2\pi}{9} \right)}+\sqrt[3]{\cos \left( \frac{4\pi}{9} \right)}=\sqrt[3]{\frac{3\sqrt[3]{9}-6}{2}}

Q14.下面是拉马努金发现的计算圆周率的公式,请你计算等式右侧级数前三项的和,并将等式右侧取倒数来计算一个近似圆周率. (提示:factorial函数也可用来计算阶乘)

\frac{1}{\pi}=\frac{2\sqrt{2}}{99^2}\sum_{k=0}^{\infty}{\frac{\left( 4k \right) !}{(k!)^4}}\frac{26390k+1103}{396^{4k}}

Q15.清风老师每年年初都会在银行存1000元私房钱,银行每年支付2%的利息。

(1)请分别计算第1年、第2年和第3年的年末清风老师银行账户的余额。

(2)根据上一小问的规律,尝试使用一行代码计算清风老师前10年每一年年末的银行账户余额。


Q16.在机器学习算法中,我们经常会将一些数据进行特征缩放(Feature Scaling)来加快算法的收敛速度。下面我们介绍特征缩放中使用最多的两个方法:

方法1:Min-Max Scaling:x^*=\frac{x-x_{\min}}{x_{\max}-x_{\min}}, 其中x_{\min}x_{\max}分别是这一组数据的最小值和最大值。可以看到,该公式对原始数据进行线性变换,使结果映射到[0, 1]的范围,来实现对原始数据的等比缩放。因此,该方法中文常被翻译为“线性函数归一化”。

方法2:Z-score Normalization:x^*=\frac{x-u}{\sigma},这里的u和σ分别是这一组数据的均值和标准差(通常为样本标准差),该方法常被翻译为“Z-score标准化”。

以方法1给大家举例,假设原来的数据为[3 5 6 2 1],最小值为1,最大值为6,因此将数据中的每个数都减去最小值1,然后再除以5(由6-1计算得到),就能够得到特征缩放的结果:[0.4 0.8 1 0.2 0].

请大家解决下面两个问题:

(1)生成包含30个元素的随机列向量a(a中每个元素都是0到100间均匀分布的随机数),分别使用上面两种方法对a进行特征缩放;

(2)生成一个30行3列的随机矩阵A(A中第一列每个元素都是0到100间均匀分布的随机数,第二列和第三列每个元素都是均值为50,标准差为20的正态分布随机数),分别使用上面两种方法对A的每一列进行特征缩放,得到的结果是一个和A大小相同的矩阵。


挑战篇

Q1.A是一个矩阵,A(:)可以按照线性索引的顺序(沿着行方向依次遍历各列元素)将A中所有元素重构成一个向量,请问怎样沿着列方向依次遍历各行将A中的所有元素重构成一个向量。

例如, A=\left[ \begin{matrix} 1& 4& 2\\ 3& 6& 8\\ \end{matrix} \right],需要输出的向量为[1  4  2  3  6  8].(输出的结果为行向量和列向量都可以)输出的结果为行向量和列向量都可以)

Q2.利用MATLAB模拟随机丢一枚骰子N次,骰子有均匀的六个面。

(1)取N = 6000,将这6000次的结果保存到向量A中

(2)统计A中出现6点的次数,记为n

(3)利用公式p=n/N计算6点出现的频率,并计算频率与实际概率之间的偏差:bias=|p-1/6|

(4)请百度“伯努利大数定律”这个概念,这是概率论与数理统计中的知识点。如何利用本题来直观的说明伯努利大数定律的成立。


Q3.清风班上有20名同学,这20名同学的编号分别是1、2、…、20。假设现在清风老师要随机请班上同学去吃饭、唱歌或者去看电影,已知每个同学被抽中去吃饭的概率是30%,被抽中去唱歌的概率为20%,剩下50%的概率是去看电影。请帮助清风老师随机抽取这些同学,并分别返回吃饭、唱歌和看电影的同学的编号。

Q4.接上一题的题干,请学过概率论与数理统计的同学接着做本题。将上一题中抽取同学去吃饭作为一个随机事件,记随机变量X为每次抽出来去吃饭的同学人数,显然:随机变量X的期望值为6人,即用20乘以0.3计算得到。请大家验证辛钦大数定律的成立。提示:将上述抽取同学去吃饭这个随机事件重复N次(N取得尽量大一点,例如1000次),并求出这N次独立事件抽出来的去吃饭的同学人数的平均值,计算该平均值和真实的期望的偏差有多大,增加N会出现怎样的情况。

Q5.MATLAB中有一个非常有用的函数: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 5 8]。

请回答下面的问题:

(1)根据上面的介绍,请你在MATLAB中测试randperm函数的功能。特别地,如果n是负数或者小数会出现怎样的情况?如果k大于n会出现怎样的情况?

(2)假设一个商品推销员要去10个不同的城市推销商品,该推销员随机选择一个城市出发,依次经过其他所有的城市后,回到出发的城市(中途经过的城市不重复),为了方便,这10个城市就用数字1至10表示。请你为该推销员随机的生成一条路线(例如2 10 8 9 1 5 7 6 3 4 2)。

(3)使用代码模拟下列场景:假设你是一名数学老师,你正在给同学们讲不定积分的计算。这时候你的PPT上出现了你备课时准备的4道练习题,你需要随机的抽取4名幸运同学到黑板上进行计算。已知你的班上共有50名同学,他们的学号分别是2023001至2023050,你在MATLAB中运行了你写的这个程序,这四名同学的学号在MATLAB中被随机地抽取出来。

(4)假设某公司在年会上设置了抽奖环节。主办方准备了一个抽奖用的不透明盒子,盒子内有10张奖券,其面值分别为[1 2 5 10 20 50 100 200 500 1000],每名员工从中随机地抽取3张,将这3张奖券的面值相加就是他能获得的现金奖励。请设计一个程序,模拟清风老师在该抽奖环节中抽取一次能获得多少钱。

(5)一副扑克牌有54张,其中大王和小王各一张,A,2,3,4,5,6,7,8,9,10,J,Q,K各有4张。假设我们不考虑桃杏梅方这四种花色,请你设计一个随机的发牌程序,为地主发20张牌,两个农民各发17张牌。为了方便,A,2,3,4,5,6,7,8,9,10,J,Q,K分别用数字1至13代替,小王用14代替,大王用15代替。进一步地,请你判断地主的牌是否有炸弹(有炸弹是指手上有双王或者有四张相同的牌例如4张3)?

Q6.最近短视频上有一个有趣的街头抽奖游戏,规则如下:摆摊的店家准备了24个大小相同的玻璃球,其中红黄蓝各8个装进一个不透明的袋子里。玩家从袋子中随机的抓出12个球,然后计算每种颜色球的个数,颜色数量多的球放在前面。比如5个红色4个蓝色3个黄色,这样就属于543。玩家抓出的12个球的颜色分布情况一定在下表所示的13种情况中。假设参与这个游戏是免费的,如果抽中了相应的情况,店家需要向玩家支付表中第二行所对应的金额。注意,除了543这一种情况玩家要赔给店家30元外,其余的12种情况玩家都是赚钱的,如果你运气好抓到了840这种情况(例如抽出了8个黄球4个红球),你可以赚300元。请模拟这个游戏,代码应返回你每次玩这个游戏获得的金额。多次运行代码,观察你是否能赚钱,你能从理论上解释原因吗?

 

本题的数据如下,方便大家在MATLAB中复制:


A = [8 8 8 7 7 7 6 6 6 6 5 5 4;
     4 3 2 5 4 3 6 5 4 3 5 4 4;
     0 1 2 0 1 2 0 1 2 3 2 3 4];
B = [300 200 200 80 60 15 100 10 5 5 5 -30 5];

Q7. 层次分析法是数学建模中一个常用的模型,它主要用于解决评价类问题,也可以为评价体系中的指标确定权重。在层次分析法中会用到判断矩阵,判断矩阵具有如下三个特点:

特点1:它是一个方阵,即行数和列数相同;

特点2:它的每个元素只能是1,2,…,9或者它们的倒数;

特点3:若它是一个n阶的方阵,那么对于任意的i, j = 1, 2, \dots, n,均满足a_{ij}\times a_{ji}=1.

例如下面的矩阵就是一个判断矩阵:

\left[ \begin{matrix} 1& 1/4& 1/2& 3\\ 4& 1& 7& 1\\ 2& 1/7& 1& 6\\ 1/3& 1& 1/6& 1\\ \end{matrix} \right]

现在给你一个矩阵A,请判断A是否符合层次分析法中判断矩阵的三个特点。

Q8.在上一题的基础上,请写出一段代码能够随机生成一个n阶(例如n=5)的判断矩阵,该判断矩阵要满足上一问中的三个特点。

提示:(1)判断矩阵的主对角线元素一定是1,为什么?(2)本章3.5节中我们学会了如何生成一个随机的对称矩阵,一个n阶的对称矩阵的上三角部分需要生成n*(n-1)/2个随机数,你需要思考本题中这个n阶的判断矩阵需要生成多少个随机数?


Q9. 生成100个随机的点,这些点都位于单位圆内:x^2+y^2 \le 1。注意,要求MATLAB输出的x和y都是长度为100的向量,分别表示这100个点的横纵坐标。

提示:我们可以借助圆的极坐标公式来生成随机数。下方我为大家准备了一段绘图的代码,大家将自己生成随机数的核心代码放入答题区域内,然后运行整段程序,就会出现类似于右侧的图形。如果你的点都位于单位圆内,则说明你的答案正确。


close all
theta = 0:0.01:2*pi;
xx = cos(theta);
yy = sin(theta);
plot(xx,yy,'r')  % 画一个单位圆
hold on
axis equal
axis([-1 1 -1 1])
% 答题区域---------开始



% 答题区域---------结束
plot(x,y,'*b')
hold off

 

Q10.和上一题题干类似,请生成100个随机的点,这些点都位于圆内。其中,圆心的坐标为(10,4),半径为10。


close all
cc = [10,4];  % 圆心
radius = 10;  % 半径
theta = 0:0.01:2*pi;
xx = cc(1) + radius * cos(theta);
yy = cc(2) + radius * sin(theta);
plot(xx,yy,'r')
hold on;  axis equal
axis([cc(1)-radius cc(1)+radius cc(2)-radius cc(2)+radius])
% 答题区域---------开始

% 答题区域---------结束
plot(x,y,'*b')
hold off

 

Q11.蒙特卡罗模拟是一种以概率和统计理论为基础的计算方法,它能通过随机数来解决许多计算问题。蒙特卡罗模拟将所求解的问题同一定的概率模型相联系,用计算机实现统计模拟或抽样,以获得问题的近似解。本题将利用蒙特卡罗模拟来计算圆周率π。

如下图所示,在边长为1的正方形内随机的生成N个随机点(图中N取的是5000),由于每一个随机点都有横纵坐标,因此我们可以将它们其绘制在图中,并用图中的小点表示。如果小点落在半径为1的1/4圆的范围内,其颜色为蓝色;否则颜色为黑色。因此蓝色小点的个数和黑色小点的个数加起来恰好等于N。

 

我们不妨记蓝色小点的个数为n,那么根据蒙特卡罗模拟的思想,

有同学可能会好奇为什么这个关系式会成立,实际上这里用到了概率论与数理统计中几何概型和大数定律的思想,我们这里不深入探究。

现在请大家使用MATLAB生成N个随机点(N取1000),每个随机点的横纵坐标都分别在区间[0,1]上均匀分布,接下来统计出位于1/4圆内的随机点的数量n,然后套用上面的公式计算出一个近似的圆周率。将你的N分别变成之前的10倍、100倍和1000倍,你计算出来的圆周率的精度有何变化?


 

Q12.学过不定积分的同学应该知道,有一些不定积分的原函数无法用初等函数表示,例如\int{\frac{x}{e^x-1}dx},对于这种类型的不定积分,如果我们要计算其在特定区间的定积分,只能通过某些数值分析的方法,例如梯形法或辛普森积分法。蒙特卡罗模拟也能帮助我们计算定积分\int_0^2{\frac{x}{e^x-1}dx},其基本的思路类似于上一题。

现在请大家根据上一题的求解步骤来计算定积分, 在此之前,你可以先在草稿纸上画出被积函数在积分区间上的草图。

注意:一个较为精确的答案是1.2139,大家可以自己对对答案看看你计算的精度如何。

函数图形如下所示:

 

Q13.清风订了一份报纸,送报人可能在早上6:30至7:30之间把报纸送到他家门口,而清风出门的时间在早上7:00到8:00之间(假设送报人到达的时间和清风出发的时间在对应的时间区间内都是均匀分布的)。请使用蒙特卡罗模拟来估计清风在离开家之前能拿到报纸的概率。注意:这是概率论中几何概型的一道经典题目,准确的概率是7/8.(思路:你可以模拟这个送报纸的过程N次,其中能拿到报纸的次数为n,那么频率n/N就能看成概率的近似值,理论依据是伯努利大数定律)


Q14. 异常值或离群值是指在一组数据中与其他数值相比差异较大的一个或几个数值。举个极端一点的例子,[4600,0,5000,5200,4700,4300,6000,5400,100000,6200]这一组数据中,我们可以认为0和100000这两个数就是异常值,因为剩下的数都集中在5000附近。异常值的识别和处理是数据清洗的重要环节,异常值的存在可能会导致后续的数据分析和建模工作出现偏差。本题将教给大家两种识别异常值的方法。

方法一:3σ原则识别异常值

学过概率论的同学应该知道,正态分布的概率密度函数图像是关于均值点处对称的,假设总体服从均值为μ,标准差为σ的正态分布,那么从该总体中随机抽取一个样本点,该点落在区间[μ-3σ,μ+3σ]上的概率约为99.73%,而超出这个范围的可能性仅占不到0.3%,是典型的小概率事件,所以这些超出该范围的数据可以认为是异常值。这就是3σ原则识别异常值的理论基础。

 

下面总结3σ原则识别异常值的步骤:(1)计算这组数据的均值μ和标准差σ(注意:我们得到的数据一般是样本数据,因此这里的标准差通常为样本标准差。如果总体标准差是已知的,那么就用总体的标准差)。(2)判断这组数据中的每个值是否都位于[μ-3σ,μ+3σ]这个区间内,如果不在这个区间内就标记为异常值。

注意事项:使用3σ原则确定异常值时,样本数据要来自正态分布总体或者近似于正态分布总体,这一点需要根据历史经验或统计检验来进行判断。

方法二:箱线图识别异常值

箱线图又称为盒须图、盒式图或箱形图,是一种用于显示数据分散情况资料的统计图,因形状如箱子而得名。下方左侧给出了一个用来反映某班男女同学身高分布情况的箱线图,右侧是箱线图上各元素所代表的含义。可以看到,箱线图可以反映数据的许多统计信息,例如均值、中位数、上四分位数和下四分位数。另外,箱线图中规定了数据的异常值,因此我们可以借助箱线图来识别数据的异常值,下面我们来介绍箱线图中异常值的定义方法。(注意:箱线图的画法不唯一,下面图形是一种典型的画法)

 

首先回顾下中位数的定义:我们将数据按从小到大的顺序排列,在排列后的数据中居于中间位置的数就是中位数,我们用Q2表示。

下四分位数则是位于排列后的数据25%位置上的数,我们用Q1表示;上四分位数则是处在排列后的数据75%位置上的数,我们用Q3表示。(MATLAB中可以直接计算出Q1和Q3,大家不用担心计算问题,请接着看后面的内容)

 

然后我们要定义一个叫做四分位距(IQR: interquartile range)的指标,它是上四分位数(Q3,即位于75%)与下四分位数(Q1,即位于25%)的距离,因此IQR=Q3-Q1。四分位距反映了中间50%的数据的离散程度,其数值越小,说明中间的数据越集中;其数值越大,说明中间的数据越分散。

接下来的工作和3σ原则识别异常值类似,我们需要给出一个合理的区间,位于该区间内的值是正常的数值,而在区间外的值就是异常值。

在箱线图中,该区间一般为[Q1-k×IQR,Q3+k×IQR], k是控制区间长度的一个正数,通常k取为1.5。因此,我们只需要判断这组数据中的每个值是否都位于[Q1-1.5×IQR,Q3+1.5×IQR]这个区间内,如果不在这个区间内就将其标记为异常值。

另外,如果我们将k取为3,那么在区间[Q1-3×IQR,Q3+3×IQR]外的异常值被称为极端异常值。

和3σ原则相比,箱线图并没有对数据总体服从的分布作任何限制性要求(3σ原则要求数据服从正态分布或近似服从正态分布),其判断异常值的标准主要以四分位数和四分位距为基础。在总体分布未知的情况下,使用箱线图识别异常值的结果更加客观。

根据上面的介绍,请完成下面的问题:

(1)清风开了一家撸猫店,他统计了最近一个月以来每天进店撸猫的人数(本故事纯属虚构)。请大家用下面这三行代码来生成一个随机的向量x,向量x就表示清风记录的最近一个月以来每天进店的人数。从下一问开始,请你假装不知道这个数据是我们随机生成的,就把它当成真实的数据。


x = fix(50+5*randn(30,1));
x(randi(30,2,1)) = randi([50,90],2,1);
x(randi(30,2,1)) = randi([20,50],2,1);

(2)计算这一个月来,撸猫人数最多的一天和最少的一天各有多少人?平均每天有多少人?标准差是多少?下四分位数、中位数和上四分位数各是多少?(提示:MATLAB中可以使用函数prctile来计算分位数,请大家自己搜索它的用法)

(3)无论是使用3σ原则还是箱线图识别异常值,均需要计算正常数值所在的区间,请分别算出这两种方法正常数值所在的区间,哪种方法的区间范围更大?

(4)分别用两种方法识别出x中存在的异常值,并返回哪些天是异常值。你可以多次运行第一小问的代码生成新的x,观察哪种方法识别出来的异常值更多?

(5)以箱线图识别的异常值为例,分别完成下面两个任务:(a)删除x中的异常值,将剩下的正常值保存到向量y中;(b)计算正常数值的平均值,并将x中的异常值替换成四舍五入后的平均值,将结果保存到向量z中。


Q15.在本章3.3.5小节介绍sort函数时,我们留下了一个问题:如果存在同学的成绩相同的情况,那么课上讲的代码将会失效,我们算出来的排名无法区分相同成绩的同学。下表给出了两种不同的排名结果,成绩越高排名越靠前,成绩相同则排名一样,但普通排名的并列排名会占据名次的数字位置,而中国式排名中的并列排名不占用名次。现给定第一行的成绩向量,请大家分别算出第二行和第三行的两种排名。(提示:可以借助ismember函数,大家不要想的过于复杂,答案不超过两行代码)

 

本题的数据如下,方便大家在MATLAB中复制:


score = [20 60 80 50 90 90 60 80 80 70 50 30];

Q16.行向量A中包含至少两个元素且A中不含元素0,请判断A中能否找到两个元素互为相反数,能找到则返回逻辑1,不能找到则返回逻辑0。例如A = [3 1 -1 2]返回逻辑1, A = [-3 4 1 2 6 -5]返回逻辑0。进一步思考,如果向量A中可能包含0,你的代码还适用吗?如果不适用请修改你的代码。例如A=[3 4 -2 0 1]返回逻辑0,A=[3 4 0 -2 0 1]和A=[-6 3 0 -5 3 2 6 1]返回逻辑1.(你能使用两种不同的思路求解吗?)

Q17. 请完成下面的一系列任务:

(1)随机生成两个长度为6的行向量s和v,s和v中的元素都是位于区间[1,10]之间的随机整数,例如随机生成的s和v分别为[2 4 1 7 4 9]和[7 8 3 2 4 5];

(2)如果s和v中相同位置的元素相同,则将该位置的元素从s和v中同时剔除掉;如果不存在这种情况则不剔除。例如:上面s和v中第五个位置的元素都是4,那么将4剔除后,新的s和v分别为[2 4 1 7 9]和[7 8 3 2 5];


Q18.本题带大家了解枚举法和网格搜索法。

枚举法在我们日常生活中使用的频率很高,它的核心思想就是枚举所有可能来找到正确或者最优的情况。

举个简单的例子:现在有一个两位数,十位数是8,个位数未知,但是知道这个数可以被9整除,请回答它的个位数是什么?显然,个位上的数只能是0 1 2 ... 9 中的一个,因此你可以依次尝试,这里面只有81符合条件。用枚举法解决问题,通常可以从以下两个方面思考:(1)找出枚举范围:我们需要列出问题中所有可能的解。在上面的例子中,枚举范围就是个位上可能存在的0到9这10个整数。(2)找出约束条件:我们需要找出问题的解应该满足的约束条件。在上面的例子中,约束条件就是这个数能被9整除。下面使用MATLAB来完成这个过程,仅需三行代码:


x = 0:9;  % 枚举范围
tmp = (mod(x+80, 9) == 0); % tmp是一个长度为10的逻辑向量
x(tmp)+80  % 输出符合约束条件的解

以上是一个非常简单的使用枚举法的例子,那么枚举法有什么缺点呢?最容易想到的缺点就是:如果枚举范围中的情况非常的多,那么枚举所有情况就非常耗费时间。例如我们要判断整数10到1亿里面哪些数是质数,这个范围就非常的大。枚举法的另一个缺点就是可能会做很多无用功导致效率低下,例如判断质数这个例子中,我们没有必要列举10到1亿中为偶数的情况,因为它们一定不是质数。另外,如果枚举范围中有无数种可能,那么我们就无法使用枚举法来解决这个问题,例如使用计算机验证哥德巴赫猜想(任一大于2的偶数都可写成两个质数之和)是不可能的,因为这里面有无数个待验证的数。

但有一种情况例外,即使枚范围中有无数种可能,我们仍可以挑选出有限种方案进行求解,这样能保证最后获得一个近似解。举个例子,我们要求函数y=2x-e^x在区间[0,1]上的最大值。如果你学过高数的话,应该很容易求出最大值在x=ln2处取得。现在假设你没有学过高数,你应该怎样借助计算机求解这个问题?

如果我们使用枚举法,由于x在区间[0,1]上有无数种可能的取值,我们不可能全部列举出来,但我们可以在区间[0,1]上按一定的步长取有限个点作为x(例如x=0,0.01,0.02,…,0.99,1),然后依次算出在这些点上y的取值,从里面挑选出最大的那个y所对应的x来作为一个的近似解,这种策略被称为网格搜索法。

因为这里只有x这一个参数,所以搜索起来比较简单。显然,选取的步长越小,找到的解会越精确,例如x取为0:0.0001:1得到的解比0:0.01:1更精确。但要注意:步长设置的越小,网格搜索所需的时间会越长,因此这里有一个权衡取舍关系:我们需要根据要获得的解的精度和求解的时间综合考虑来设置一个合适的搜索步长。

另外,如果搜索的参数很多,例如我们要求出二元函数z=f(x,y)在x和y都属于[0,1]区间时它的最大值,那么我们使用网格搜索时就要对x和y可能的取值进行排列组合,假设x和y各有一万种可能的取值,那么我们的搜索次数将会高达一亿次。

如果有更多要搜索的参数,那么这个计算量将会非常的大,搜索次数随着要搜索的参数数量呈指数增长。因此,研究优化理论的学者提出了很多高效的优化算法,这些算法能够在可接受的计算时间下给出待解决的优化问题的一个可行解。做数学建模的同学可能听过启发式算法,常见的启发式算法有模拟退火、粒子群算法、遗传算法等。总之,优化算法的内容非常丰富,本题仅通过介绍枚举法和网格搜索法来引出相关的概念,有兴趣的同学可以在网上查阅相关的资料。

下面请大家完成下面的练习题:

(1)使用网格搜索法求出y=2x-e^x在区间[0,1]上的最大值,并求出此时的x。

(2)使用网格搜索法求出f(x,y)=x^3-y^3+18x^2+12y^2-9x-9y在x和y都位于区间[-1,1]上的最小值,并求出此时x和y的值。(提示:你可能需要使用meshgrid函数生成xy平面上的二维网格坐标,该函数具体的用法可以查看MATLAB帮助文档。本题的参考答案为-2.854,最小值在(0.245,0.394)处取得)

(3)假设你知道y=2x-e^x在区间[0,1]上的图形是先递增后递减,你将如何改进你的搜索策略来提高搜索效率。(不需要写代码,可以用文字描述这种策略)

(4)如下图所示,图上标出了五个村庄的坐标,现在要在横轴上(看成一条河流)选取某一点修建一座桥,请问在哪个位置修桥可以使这五个村庄的距离到桥的距离之和最短,这里的距离请用曼哈顿距离计算。

 


Q19.本题考察大家收集资料以及自学的能力。请大家查询相关资料并回答下面几个问题:

(1)本章中我们学过如何生成随机数,请大家搜索生成可重复的随机数的方法。

(2)如果大家学过概率论与数理统计,那么一定知道泊松分布和指数分布,请大家搜索生成这两个分布的随机数的方法。

(3)请大家自学MATLAB中排列组合的两个函数:nchoosek和perms。

Q20. 本题将带大家学习皮尔逊相关系数和斯皮尔曼相关系数的计算步骤。

(1) 皮尔逊相关系数(Pearson correlation coefficient)

皮尔逊相关系数用于度量两组数据X和Y之间的线性相关的程度,它的范围为-1到+1,其中0代表无线性相关性,负值代表线性负相关,正值代表线性正相关。

在现实生活中,我们收集到的数据可以分为总体数据和样本数据,根据收集的数据类型不同,我们计算皮尔逊相关系数的公式也有所区别。通常我们收集到的数据都是样本数据,因此下面给出样本皮尔逊相关系数的计算公式。

请你根据公式计算下表给出的X和Y的样本皮尔逊相关系数。

(提示:答案是0.7629,你也可以使用MATLAB内置的corrcoef函数计算X和Y的皮尔逊相关系数,根据公式算出的结果应和内置函数的返回结果相同)

(2)斯皮尔曼等级相关系数(Spearman's rank correlation coefficient)

斯皮尔曼等级相关系数简称斯皮尔曼相关系数,或称为秩相关系数,它是一种非参数方法,用于衡量两个变量依赖性的强度和方向。与皮尔逊相关系数不同,斯皮尔曼相关系数不要求两个变量是线性相关的,它主要用于衡量两个变量之间单调关系的强度和方向。斯皮尔曼相关系数的范围为 -1到+1,如果当X增加时,Y趋向于增加,则斯皮尔曼相关系数为正;如果当X增加时,Y趋向于减少,则斯皮尔曼相关系数为负;斯皮尔曼相关系数为0表明当X增加时Y没有任何趋向性。

在介绍斯皮尔曼相关系数的计算公式之前,我们先介绍秩(或称为等级)的概念。一个数的秩就是将这个数所在的那组数据按照从小到大的顺序重新排列,这个数所处的位置下标;若出现相同的数,则将它们的位置下标计算平均值作为它们的秩(这里介绍的秩和矩阵的秩没有任何关系,大家不要弄混了)。

(例1)计算 18、23、9、11、3、20这组数据中各元素的秩。

首先从小到大进行排序:3、9、11、18、20、23;那么,18所处的位置下标是4;23所处的位置下标是6;9所处的位置下标是2;11所处的位置下标是3;3所处的位置下标是1;20所处的位置下标是5;因此,这组数据的秩就是:4、6、2、3、1、5。

(例2)计算 18、23、9、11、11、20这组数据中各元素的秩。

首先从小到大进行排序:9、11、11、18、20、23;那么,18所处的位置下标是4;23所处的位置下标是6;9所处的位置下标是1;11所处的位置有两个,下标分别是2和3,将2和3求平均值等于2.5; 20所处的位置下标是5;因此,这组数据的秩就是:4、6、1、2.5、2.5、5。

介绍完秩的概念后,我们就能计算斯皮尔曼相关系数,它的计算方法有两种:(1)直接套用公式计算;(2)计算X和Y的秩之间的皮尔逊相关系数,将这个结果当成原始数据X和Y之间的斯皮尔曼相关系数。

第一种方法是基于以下公式直接计算: 

举个例子,假设要计算X = [3 8 4 7 2]和Y = [5 10 8 10 6]这两组数据的斯皮尔曼相关系数,那么我们可以先求出X和Y对应的秩,然后算出秩差和秩差的平方:

 

接下来只需要套用公式算出r_s=1-\frac{6\times \left( 1+0.25+0+0.25+1 \right)}{5\times 24}=0.875.

第二种方法是计算X和Y的秩之间的皮尔逊相关系数,即计算数据[2 5 3 4 1]和数据[1 4.5 3 4.5 2]的皮尔逊相关系数,大家可以自行计算,得到的结果为0.8721。

可以看出,两种方法得到的结果有细微差别,这是因为原来的Y数据中有重复的元素。可以证明的是:如果X中的元素各不相同,且Y中的元素也各不相同时,两种方法得到的结果是相等的。

下面请大家编写代码求解下表中X和Y的斯皮尔曼相关系数,你需要使用上面介绍的两种方法分别计算。

 

(提示:计算一组数据的秩需要用到sort函数,你需要思考如何处理存在相同数值的情况;当然,如果你绞尽脑汁也没有想出来怎么处理,你可以在MATLAB官网搜索tiedrank函数的用法。参考答案:第一种方法得到的结果为0.6401,第二种方法得到的结果为0.6386。另外,大家可以在MATLAB官网搜索corr函数,该函数可用来计算斯皮尔曼相关系数)

本题的数据如下,方便大家在MATLAB中复制:


X = [92	79	78	96	64	88	88	69	78	53	52	77	89];
Y = [58	29	41	47	19	40	35	42	34	27	17	41	38];

以上就是MATLAB教程新手入门篇的第三章的课后习题,大家一定要认真做,这些题目都是按照本章知识点精心编写的,对大家编程能力的提高非常有帮助。

参考答案:

MATLAB课程第3章课后习题讲解——数学建模清风老师_哔哩哔哩_bilibili

  


点击下方的CSDN专栏阅读下一篇文章:

MATLAB入门课程专栏

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值