MATLAB之逻辑


概述

上一节的内容中,我们介绍了索引的使用方法。索引的目的是为了取出矩阵中的一部分元素,因此我们知道通过元素在矩阵中的位置我们可以实现索引。在本节中,我们将介绍MATLAB中的逻辑变量以及通过逻辑变量索引的方法。

MATLAB中存在一种logical(逻辑)类型用于表示逻辑上的真和假。在其他程序语言中,这样的一种类型也叫做bool型变量。这一种变量本身只有两种值,分别为true和false。规定false对应数值0,true对应其他值(特别地,使用时可以用任意非零值代表true,但存储时会自动转为1代表true,这样的好处是只需要占用一个比特的空间)。

逻辑变量

logical变量只存在两种值true(真)或者false(假),规定分别用数字1和0存储。以逻辑值组成的矩阵称为逻辑矩阵。一般有以下几种创建逻辑矩阵的方法,各有用处。

方法一:直接赋值法

直接用true,false直接赋值到一个矩阵,缺点操作复杂,一般不考虑这种方法。

x = [true false] % 正确实例
A = [1 0] % 错误实例
whos

输出值

x =
     1     0
A =
     1     0
% 尽管两个语句的输出一样
% 但是通过whos命令可以看到变量的类型不一样
% 可以看到只有用true,false直接赋值才能创建逻辑矩阵
% 一般不考虑这种方法
  Name      Size            Bytes  Class      Attributes

  A         1x2                16  double               
  x         1x2                 2  logical 

方法二:logical函数法

logical函数是将数值或矩阵转换为逻辑值的函数。遵循的转换规则为:非零值为逻辑1,零值为逻辑0。这种方法将一个矩阵非零值对应转为逻辑矩阵中的1。可以用作非零值的逻辑索引。

函数法

% logical
A = [1 0 3;0 5 6];
x1 = logical(1)
whos
% 对于传入的数值或矩阵
% 非零值为逻辑1,零值为逻辑0
x2 = logical(0)
x3 = logical(2)
x4 = logical(A)
% 生成的逻辑矩阵作为索引,可以取出矩阵中对应位置为true的元素
x5 = A(logical(A))

命令行输出

% logical
x1 =
     1
% 观察两个变量的类型(Class)和比特数(Bytes)
% A属于double类型(占用48比特)
% x1属于logical类型(占用1比特)
  Name      Size            Bytes  Class      Attributes
  A         2x3                48  double               
  x1        1x1                 1  logical              
x2 =
     0
x3 =
     1
x4 =
     1     0     1
     0     1     1  
% 形如A(logical(A))可以取出A中的非零元素
x5 =
     1
     5
     3
     6

方法三:借用逻辑表达式(命题)

命题就是判断一个事件的陈述句。对于数值来说一个判断的陈述句通过关系运算符连接。
MATLAB的关系运算符共6个:等于(==),不等于(~=),大于等于(>=),大于(>),小于等于(<=),小于(<)。
这种方法创建逻辑矩阵最为常见,能够很高效地创建对应的逻辑矩阵,同时进行逻辑运算并作为索引

逻辑表达式

% 逻辑表达式
A = [1 0 3;0 5 6];
x1 = (3 == 2)
x2 = (3 ~= 2) 
x3 = (3 >= 2)
x4 = (3 >  2)
x5 = (3 <= 2)
x6 = (3 <  2)
% 特别地,对矩阵使用关系运算符返回一个相应的逻辑矩阵
x7 = (A < 4)
% 返回的矩阵是逻辑矩阵,又可以作为索引,取出矩阵中满足判断条件的元素
x8 = A(A < 4)

命令行输出

% 逻辑表达式
% 对于仅由数值构成的逻辑表达式,返回该表达式的真假性
x1 =
     0
x2 =
     1
x3 =
     1
x4 =
     1
x5 =
     0
x6 =
     0
% 对于由矩阵构成的逻辑表达式,返回和该矩阵等大小的逻辑矩阵
% 逻辑矩阵的值是矩阵相应位置元素的判断情况
x7 =
     1     1     1
     1     0     0
% 第一行全行,第二行1个元素大于4,满足判断记为1,其他值记为0
% 这里的A(A < 4)就对应取出A中小于4的元素
x8 =
     1
     0
     0
     3

逻辑表达式的运算

对于逻辑值之间的运算,可以实现逻辑表达式的复合运算,这时可以实现联合条件的逻辑索引。有四种运算:逻辑与(&,&&),逻辑或(|,||),逻辑异或(xor函数)和逻辑非(~)。这四种逻辑运算服从以下的真值表。

逻辑真值表

A B A&B A|B xor(A,B) ~A
0 0 0 0 0 1
0 1 0 1 1 1
1 0 0 1 1 0
1 1 1 1 0 0

应用实例

A = [1 0 3;0 5 6];
x1 = A((A < 4)&(A > 2))
x2 = A((A < 4)|(A > 2))
x3 = A(xor((A < 4),(A > 2)))
x4 = A(~(A < 4))
% &&和||是&和|的变体
% 只能用于标量,不能用于矩阵,但速度更快
x5 = (3 > 4)&&(3 > 2)
x6 = (3 > 2)||(3 > 4)

命令行输出

% & 与
x1 =
     3
% | 或
x2 =
     1
     0
     0
     5
     3
     6
% xor函数 异或
x3 =
     1
     0
     0
     5
     6
% ~ 取非,取反
x4 =
     5
     6
% && 适用于标量的与(利用逻辑与的特性加速运算)
% (如果第一个值为0,立即判断该值为0)
x5 =
     0
% || 适用于标量的或(利用逻辑或的特性加速运算)
% (如果第一个值为1,立即判断该值为1)
x6 =
     1

find函数——逻辑索引的辅助工具

find函数是将逻辑矩阵索引直接转换为直接索引(下标位置)的函数。我们有时候作出了判断,但是却需要直接索引的信息,这时可以利用find函数进行转换;另一个用处是,找到前n个满足条件的索引

% find函数
A = [2 5 4 0 0 6];
x1 = A > 2
x2 = find(A > 2)
B = [2 5 4;0 0 6];
% 按列产生线性地址索引
x3 = find(B > 2)
x4 = B(find(B > 2))
% 满足条件的前两个值的索引
x5 = find(B > 2,2)

命令行输出

% find函数
% 逻辑索引
x1 =
     0     1     1     0     0     1
% 线性地址索引
x2 =
     2     3     6
% 根据这个输出,可以发现,按列产生线性地址索引
x3 =
     3
     5
     6
% 因为是线性地址索引,B(find(B > 2))依然有效,结果与B(B > 2)一样
x4 =
     5
     4
     6
% 满足条件的前两个值的索引
x5 =
     3
     5

重在应用

以下是逻辑数组的三种基本应用,根据判断条件进行,逻辑索引查找,替换和删除。

1.一组数据[1 2 4 6 7 8 9 0 4 5 3 2 4 2 2 3 4 2 3],依次找出其中在区间[2,6]中的数。

% 查找
A = [1 2 4 6 7 8 9 0 4 5 3 2 4 2 2 3 4 2 3];

2.一组数据[1 2 4 6 7 8 9 0 4 5 3 2 4 2 2 3 4 2 3],依次将其中在区间[2,6]中的数替换为10。

% 替换
A = [1 2 4 6 7 8 9 0 4 5 3 2 4 2 2 3 4 2 3];

3.一组数据[1 2 4 6 7 8 9 0 4 5 3 2 4 2 2 3 4 2 3],删除其中在区间[2,6]中的数。

% 删除(要求在矩阵A中改变值)
A = [1 2 4 6 7 8 9 0 4 5 3 2 4 2 2 3 4 2 3];

参考思路

1.一组数据[1 2 4 6 7 8 9 0 4 5 3 2 4 2 2 3 4 2 3],依次找出其中在区间[2,6]中的数。

% 查找
A = [1 2 4 6 7 8 9 0 4 5 3 2 4 2 2 3 4 2 3];
B = A((A>=2)&(A<=6))

2.一组数据[1 2 4 6 7 8 9 0 4 5 3 2 4 2 2 3 4 2 3],依次将其中在区间[2,6]中的数替换为10。

% 替换
A = [1 2 4 6 7 8 9 0 4 5 3 2 4 2 2 3 4 2 3];
A((A>=2)&(A<=6)) = 10

3.一组数据[1 2 4 6 7 8 9 0 4 5 3 2 4 2 2 3 4 2 3],删除其中在区间[2,6]中的数。

% 删除
A = [1 2 4 6 7 8 9 0 4 5 3 2 4 2 2 3 4 2 3];
A=A(~( (A>=2) & (A<=6) ))

小结

本节内容不多,但是逻辑索引比起线性地址的等间距索引索引的产生要更加普遍,所以,希望读者熟练掌握这三种基本应用。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,088评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,715评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,361评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,099评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 60,987评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,063评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,486评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,175评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,440评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,518评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,305评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,190评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,550评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,880评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,152评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,451评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,637评论 2 335

推荐阅读更多精彩内容