MATLAB知识点:利用逻辑值引用矩阵的元素

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

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


节选自第3章 3.4.4 逻辑运算

3.4.4.2    利用逻辑值引用矩阵的元素

前面我们学过MATLAB中的向量和矩阵,并介绍过如何通过元素所处的位置索引来引用(提取)所需的元素。例如:若a是一个向量,则a(1:2:end)表示提取a中所有奇数位置的元素;若A是一个矩阵,则A(1:2:end, :)表示提取A中所有奇数行的元素。

本小节我们介绍引用矩阵的元素的另一种方式:利用逻辑值。

假设有一个m行n列的矩阵A,我们要提取其指定位置的元素,那么我们可以生成一个和A同样大小的逻辑矩阵L,L中的元素要么是逻辑值1,要么是逻辑值0,其中:等于逻辑值1的元素所处的位置是我们所需要的。接着我们只需要使用命令A(L),就能够在A中提取出指定位置的元素。通常逻辑矩阵L是由一系列的逻辑运算或者条件运算得来的。

举个例子,我们要提取A中所有小于等于3的元素,这里的A是我随机生成的一个矩阵:

MATLAB知识点:利用逻辑值引用矩阵的元素_第1张图片

这里的L就是通过关系运算得到的一个逻辑矩阵,它的大小和A相同,L中为逻辑值1的位置就是矩阵A中要引用的位置。

注意:命令A(L)得到的结果是一个列向量,有同学会问:为什么A(L)返回的列向量中的元素顺序是3,1,2,而不是其他的顺序?这是因为MATLAB会按照线性索引的顺序来返回提取的元素,就类似于A(:)命令可以将A中的所有元素按照线性索引的顺序返回一个列向量。

以后大家熟练的话,可以直接写成A(A<=3)来提取A中所有小于等于3的元素。再举个例子,如果要提取A中大于等于5且小于8的元素,我们可以使用A( A>=5 & A < 8),千万不能写成A(5 <= A < 8),也不能使用&&运算符:A( A>=5 && A < 8),&&运算符只能用于标量的逻辑运算。

注意,这里有一个易错点:L必须是逻辑矩阵,即里面的0和1都必须是逻辑值,不能是由数字0和1构成的数值矩阵。如果L是数值矩阵,可以使用logical函数进行转换。

练习题:清风班上有20名同学,这20名同学的编号为数字1至20。现在清风老师要随机请一些同学去吃饭,每名同学被抽中的概率都是50%,请帮助清风老师随机抽取这些同学(学过概率论的同学应该能够看出来,每名同学是否能被选中均服从一个伯努利分布,就类似于独立的投20次篮,每次投中的概率都是0.5)。

答案如下:

A   = 1:20;  % 这20名同学的编号为1,2,……,20
x   = randi([0,1],1,20);  % 随机生成20个由0和1构成的随机数
L   = logical(x);  % 转换成逻辑值
A(L)  %   使用逻辑向量L引用A中的元素

为什么上面的答案可行?第二行代码随机生成了一个包含20个元素的行向量x,向量x中的每个元素都是随机生成的0或1,其中0代表同学没有被选中,1代表同学被选中。由于randi函数用来生成随机的均匀分布的整数,因此出现0和1的概率相同,这就满足了每名同学被抽中的概率都是50%。第三行代码使用logical函数将x这个数值向量转换成了逻辑向量,这样才能通过逻辑值对向量元素引用。大家可以自己尝试,如果不使用logical函数进行转换的话,MATLAB就会报错:数组索引必须为正整数或逻辑值。

除了以上方法外,还有一种更为通用的方法,不妨假设每名同学被抽中的概率都是p,其中0≤p≤1,那么我们可以借助下面的代码来抽取这些同学:

更通用的答案:

p = 0.5;  % 每名同学被抽中的概率
A = 1:20;  % 这20名同学的编号为1,2,……,20
r = rand(1,20);  % 随机生成20个在0至1区间上均匀分布的随机数
L = (r < p);  % r和p比较大小
A(L)   % 使用逻辑向量L引用A中的元素

在更通用的答案中,我们通过比较由rand(1,20)生成的、位于[0, 1]区间上的20个随机数r与每名同学被抽中的概率p来构建逻辑数组L。对于每一个元素r(i),如果r(i) < p,则L(i)为逻辑值1,表示第i个同学被抽中;反之,如果r(i) >= p,则L(i)为逻辑值0,表示第i个同学未被抽中。最终,逻辑数组L的逻辑值1和逻辑值0会被用来从原始数组A中提取元素,即A(L)会返回所有被抽中同学的编号。

下面我们再来看一个练习题:随机生成200名同学的考试得分(0-100整数),统计得分大于等于60分的同学人数,并计算得分位于区间[60,80]内的所有同学的平均分。

答案如下:

A   = randi([0,100],200,1);  % 随机生成200名同学的分数
sum(A>=60)   %   大于等于60分的人数
tmp   = A(A<=80 & A >=60);  % 区间[60,80]内的所有分数
mean(tmp)  %   计算平均值

你可能感兴趣的:(MATLAB知识点详解,数学建模,matlab)