在程序流控制过程中,在逻辑、模糊逻辑推理中,都需要对一类是非问题做出“是真,是假”的回答,为此,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
生成了在数组长度和大小上都满足要求的数组,上述两个案例就演示了关系操作符的实用。还存在一个非常实际的用于可以用关于运算符填补数值运算中省缺问题
图像出现了断点,这是因为数值计算结果中出现了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);
逻辑操作
大小判断仅是简单的关系操作,逻辑操作“与”、“或”、“非”引入将使的复杂运算关系成为可能
指令 | & | | | ~ | 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逻辑判断挺使用的,可以很有效的满足流程化处理和逻辑运算,希望大家快学起来。