首页/文章/ 详情

Matlab关系逻辑判断操作灵活运用实例演示

2年前浏览3797

    在程序流控制过程中,在逻辑、模糊逻辑推理中,都需要对一类是非问题做出“是真,是假”的回答,为此,Matlab设计了关系操作、逻辑操作一些相关函数。过冷水在实际学习过程中也需要做一些逻辑判断的工作,过冷水在实际工作中遇到这么一种情况,已知A,B两个矩阵要对B矩阵做判断

1 : B矩阵中的元素是否A矩阵中都有出现?

2:B矩阵中的和A矩阵元素相同情况下是否B中元素出现个数是否小于A矩阵中元素出现个数?

如果同时满足上述两个条件则为真,不能同时满足则为假。本期过冷水就和大家一起学习一下逻辑关系的灵活处理。

 

MATLAB约定:

在所有关表达式和逻辑表达式中,作为输入的任何非·数都被看作是“逻辑真”,而只有0才被认为是“逻辑假”。

所有关系表达式和发辑表达式的计算乡

吉果,即输出,是一个由0和1组成的“逻辑数组(Logical Array)"。在此数组中的1表示“真”,0表示“假”。

逻辑数组是一种特殊的数值数组。既然它归属“数值类”,那么与数值类”有关的操作和函数对它也同样适用。但它又不同于普通的数值,它还表示着对事物的判断结论“真”与“假”因此,它有自身的特殊用途,如数组寻访等。

指令

含义

指令

含义

<

小于

>=

大于等于

<=

小于等于

 ==

等于

>

大于

~=

不等于

 

标量可以与任何维数组进行比较。比较在此标量与数组每个元素之间进行,因此比较

结果将与被比数组同维。

●当比较量中没有标量时,关系符两端进行比较的数组必须维数相同比较在两数组相

同位置上的元素间进行,因此比较结果将与被比数组同维。

实际应用中冷水喜欢将矩阵运算中讲标量指定为一个标准通过大小判断来实现自己的目标。

从变数主中挑选满足要求的数据

data=[2.024767802 4.93616418
2.037954363 4.956303204
2.051140924 4.978076337
2.064327485 5.002673855
2.077514047 5.030671981
2.090700608 5.062918319
4.464281619 5.997851628
4.47746818 6.002046875
4.490654741 6.006889538
4.503841303 6.012163812
4.517027864 6.017653892];
a=data(:,1)>=2.05
[m,~]=find(a==1)
data1=data(m,:)
a =
  11×1 logical 数组
   0
   0
   1
   1
   1
   1
   1
   1
   1
   1
   1
m =
     3
     4
     5
     6
     7
     8
     9
    10
    11
data1 =
    2.0511    4.9781
    2.0643    5.0027
    2.0775    5.0307
    2.0907    5.0629
    4.4643    5.9979
    4.4775    6.0020
    4.4907    6.0069
    4.5038    6.0122
    4.5170    6.0177

数据简单的时候当然可以人为惊醒挑选数据,面对大量数据的时候或者工作复杂的时候肯定要选择用程序判断,上述案例就很好的实现了挑选出大于2.05的数据。在控制流工作中可以作为结束或继续运行的命令判断

经典for 循环

data=[];
for i=1:5
    a=rand(1);
    data=[data a];
end
data
data =
    0.0975    0.2785    0.5469    0.9575    0.9649

加入大小逻辑判断

data=[];
for i=1:5
    a=rand(1);
    if a >0.5
        data=[data a];
    end
end
data
data =
    0.8407    0.8143    0.9293

可看出我们筛选出来了大于0.5的数据,可以data数据不满足五个数据,针对这样的情况也可以用while 判据和大小判据进行结合

data=[];n=1;
while n <= 5
    a=rand(1);
    if a>0.5
        data=[data a];
        n=n 1;
    end
end
data
data =
0.7572    0.7537    0.5678    0.5308    0.7792

生成了在数组长度和大小上都满足要求的数组,上述两个案例就演示了关系操作符的实用。还存在一个非常实际的用于可以用关于运算符填补数值运算中省缺问题

image.png 

图像出现了断点,这是因为数值计算结果中出现了NaN符号,我们可以用逻辑判断进行处理。

x=-3*pi:pi/10:3*pi
y=sin(x)./x
xx=x (x==0)*eps;%断点处特殊处理
yy=sin(xx)./xx
 
figure1 = figure;
subplot1=subplot(1,2,1,'Parent',figure1)
plot(x,y,'LineWidth',3);
ylabel('y','FontWeight','bold','FontAngle','italic','FontSize',14,'FontName','Times New Roman');
xlabel('x','FontWeight','bold','FontAngle','italic','FontSize',14,'FontName','Times New Roman');
title('$y = \frac{sin(x)}{x}$','FontWeight','bold','FontSize',20,'Interpreter','latex');
ylim(subplot1,[-0.4 1.2]);
box(subplot1,'on');
hold(subplot1,'off');
set(subplot1,'LineWidth',3);
subplot2=subplot(1,2,2,'Parent',figure1)
plot(xx,yy,'LineWidth',3);
ylabel('y','FontWeight','bold','FontAngle','italic','FontSize',14,'FontName','Times New Roman');
xlabel('x','FontWeight','bold','FontAngle','italic','FontSize',14,'FontName','Times New Roman');
ylim(subplot2,[-0.4 1.2]);
box(subplot2,'on');
hold(subplot2,'off');
set(subplot2,'LineWidth',3);


image.png 

逻辑操作

 

大小判断仅是简单的关系操作,逻辑操作“与”、“或”、“非”引入将使的复杂运算关系成为可能

指令

&

|

~

xor

含义

异或

 

引入逻辑操作或挑选数据就更加方便了比如对数主进行掐头去尾

[m,~]=find(a==1)
data1=data(m,:)
a =
  37×1 logical 数组
   0
   0
   0
   0
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   1
   0
   0
   0
   0
   0
   0
   0
   0
   0
m =
 
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
data1 =
    2.0024    0.0000
    2.9071    1.4494
    2.9548    1.8256
    3.0024    2.1493
    3.0976    2.5231
    3.8595    1.1466
    3.9071    1.0905
    3.9548    1.0397
    4.0024    0.9951
    4.1929    0.8713
    4.9548    0.8006
    5.0024    0.8049
    5.2405    0.8634
    5.2881    0.8826
    5.3357    0.9066
    5.3833    0.9345
    5.4310    0.9642
    5.4786    0.9931
    5.5262    1.0195
    5.5738    1.0422
    5.6214    1.0617
    5.6690    1.0799
    5.7167    1.0994
    5.9548    1.1590

重新构成了一个第一列数据大于2小于6的数值,完美! 结合while 生成0.4~0.8这个范围的随机数

data=[];n=1;
while n <= 5
    a=rand(1);
    if a>=0.4&a<=0.8
        data=[data a];
        n=n 1;
    end
end
data
data =
0.5688    0.4694    0.7943    0.5285    0.6020

学会了与或非和大小关系判断就可以初步解决我的实际问题,人为给定两个元素

 A=[1 2 3 4 5 5 5 1 1 2 3];
    B=[2 1 5];
    C=intersect(A,B)
    D=C==sort(B)
C =
     1     2     5
D =
  1×3 logical 数组
   1   1   1

上述操作实现了元素是否都出现的判断,在判断一下元素个数是否满足B中元素出现个数是否小于A矩阵中元素出现个数

 sum(A==C')>=sum(B==C')

上述语句就是元素个数长度的判断,使用&将两个判据合并在一起

A=[1 2 3 4 5 5 5 1 1 2 3]';
B=[2 1 5]';
C=intersect(A,B)
D=[C==sort(B)]'&sum(A==C')>=sum(B==C')
C =
     1
     2
     5
D =
  1×3 logical 数组
   1   1   1

这样就解决了我的实际问题,用这个方法可以挑选出我想要的矩阵B

逻辑函数

Matlab能给出的“逻辑数组”类型计算结果的函数有很多。包括:含0元素数组判断函数、逻辑数组创建函数、数据对象判断函数、数据类型判断函数,过冷水给出常用逻辑函数表

分类

描述

含0数组判断

all

数组A不含0元素,返回1

any

数组A不是全0元素,返回1

生成逻辑数组

 false

按指定大小创建全0逻辑数组

 true

按指定大小创建全1逻辑数组

logical

创建逻辑数组;1对应输入数组的非0元素

数据对象判断

isempty

是否空矩阵

isprime

是否质数

isfinite

是否有限数

isreal

是否实数

isinf

是否无穷大

isletter

是否字母

isnan

是否非数

isspace

是否空格

数据类型判断

isa

是否指定类别

ishandle

是否图柄

ischar

是否字符串

islogical

是否逻辑类型

isgkobal

是否全局变量

isnumeric

是否数值类型

 有了逻辑函数的帮助上述矩阵D逻辑判断就可以用alll做简化。过冷水在实际实际工作中用A,B两个字符串矩阵,A是目标矩阵含有字符串类型已固定,B矩阵为输入矩阵,输入元素个数和名字不确定,需要对B矩阵做判断,并要锁定B矩阵字符串位置

A=["apple";"apricot";"peach";"mango";"cherry"];
B=["apple","mango","cherry"]
[m,~]=size(A);[~,n]=size(B)%
 match=B==A;%转换为一个判断矩阵,行表示A中名称,列表示B的名称
 [m,n]= find(match==1);
%使用any函数判断有B中是否有A中的目标字符串
 if any(match(1,:))
     disp('contain:apple');
     apple_position=n(find(m==1));
     disp('position:'),disp(apple_position)
 end
 if any(match(2,:))
     disp('contain:apricot')
     apricot_position=n(find(m==2));
     disp('position:'),disp(apricot_position);
 end
 if any(match(3,:))
     disp('contain:peach');
     peach_position=n(find(m==3));
     disp('position:'),disp(peach_position)
 end
 if any(match(4,:))
     disp('contain:mango')
     mango_position=n(find(m==4));
     disp('position:'),disp(mango_position)
 end
 if any(match(5,:))
     disp('contain:cherry')
     cherry_position=n(find(m==5));
     disp('position:'),disp(cherry_position)
 end
B = 
  1×3 string 数组
    "apple"    "mango"    "cherry"
n =
 
     3
contain:apple
position:
     1
contain:mango
position:
     2
contain:cherry
position:
     3

成功给出了字符串匹配的结构和给出了给出了B中字符串的位置。逻辑函过冷水还使用all做全匹配识别,本期过冷水就是想提醒大家,有是否Matlab逻辑判断挺使用的,可以很有效的满足流程化处理和逻辑运算,希望大家快学起来。


MATLAB
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2022-04-26
最近编辑:2年前
过冷水
博士 | 讲师 讨论号:927550334
获赞 360粉丝 184文章 107课程 11
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈