MATLAB知识点:逻辑运算函数

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

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


节选自第3章 3.4.4 逻辑运算

3.4.4.1     逻辑运算函数

在上一节介绍关系运算时,我们提到过:MATLAB中使用逻辑值表示布尔变量,逻辑值1代表真(true),逻辑值0代表假(false)。而逻辑运算就是对逻辑值进行的运算。大部分的编程语言都会涵盖四个最基本的逻辑运算方法:逻辑与、逻辑或、逻辑非和逻辑异或。

下表给出了MATLAB中的定义(注意:下表中的1和0是逻辑值1和0):

注意,上表中函数名和对应的运算符可以执行相同的功能,除了“逻辑异或”没有相应的运算符外,剩下三个运算方法都有对应的运算符。

这四个运算方法的使用方法较为相似,以“逻辑与”为例,大家可以查看“逻辑与”的帮助文档:A & B 对数组 A 和 B 执行逻辑 AND 操作,并返回包含设置为逻辑值 1 (true) 或逻辑值 0 (false) 的元素的数组。如果 A 和 B 在相同的数组位置都包含非零元素,则返回的数组中对应位置的元素将设置为逻辑值 1 (true)。如果不是,则将数组元素设置为 0。and(A,B) 是执行 A & B 的替代方法,但很少使用。(注:该帮助文档来自于MATLAB2023之前的版本,新版本增加对表格类型数据的计算)

从帮助文档可以得知:(1)MATLAB推荐大家直接使用运算符进行计算,因此&、|和~这三个符号的功能大家要牢记,我们主要使用这三个符号而不是对应的函数进行计算。(2)“逻辑与&”是对数组A和B进行计算的,计算时会比较A和B对应位置的元素。数组A和B的大小不一定要完全相同,只需要符合算术运算中介绍的五种兼容模式即可。(3)“逻辑与&”不仅可以作用在逻辑值0和1上,还可以用于普通的数值上,这时候,MATLAB会将非零数值视为逻辑1,将数值零视为逻辑0进行运算。例如:3&5返回逻辑值1,-4&0返回逻辑值0。我们来看两个例子:

有同学可能会有疑问,为什么MATLAB会将非零数值视为逻辑1,将数值零视为逻辑0?这是因为MATLAB在进行逻辑运算之前,在计算机内部自动将数值转换成了逻辑值。我们也可以使用logical函数手动进行转换:

L = logical(A) 将 A 转换为一个逻辑值数组。A 中的任意非零元素都将转换为逻辑值 1 (true),零则转换为逻辑值 0 (false)。复数值和 NaN 不能转换为逻辑值。

举个例子,我们随机生成一个4行3列的矩阵,将矩阵中非0位置的元素转换成逻辑值1,等于0的位置的元素转换成逻辑值0:

特别地,我们还可以使用true和false函数分别创建全为逻辑1和逻辑0的逻辑矩阵。以true函数为例,它的主要用法有两种:(1)true(n)可以生成一个n行n列全为逻辑值1的方阵,特别地,当n等于1时可以简写为true,此时表示一个常量;(2)true(m,n)可以生成一个m行n列全为逻辑值1的矩阵。

除了“逻辑与&”外,剩下的三个逻辑运算函数也可以用于普通的数值上,MATLAB也会将非零数值视为逻辑1,将数值零视为逻辑0进行运算,下面我们举几个例子:

另外,我们有时候也会使用“逻辑与 &”和“逻辑或 |”进行连续运算,例如1 & 2 & 3和0 | 3 | 0的结果都是逻辑1,下面我们再看几个例子:

下面我们再次谈谈运算优先级的问题,MATLAB中的运算符有不同的计算优先级,优先级高的先进行计算,例如3+4*2等于11而不是14,这是因为乘法的优先级高于加法。类似的,关系运算符(例如>、==、~=)的优先级要高于逻辑运算符&和|,例如3 > 4 & 2 > -1的返回结果是逻辑0。大家可以去MATLAB官网查看运算符优先级的帮助文档,但没有必要刻意去记,我们只需要养成一个好的习惯:使用小括号来指定计算的先后顺序,例如我们可以将上面的代码改成(3 > 4) & (2 > -1),这样计算的先后顺序看起来会清楚很多。另外有一个特殊的优先级顺序需要大家了解, & 运算符的优先级要高于 | 运算符。尽管 MATLAB 通常按从左到右的顺序计算表达式,但表达式 a|b&c 按 a|(b&c) 形式计算,因此,对于同时包含 & 和 | 的语句,比较好的做法是使用小括号显式地指定期望的语句优先级。

我们来做一个小练习:随机生成一个具有20个元素的向量,用来表示20名同学的成绩(假设成绩为满分100分的整数制)。请通过代码计算得到一个具有20个元素的逻辑向量,向量中对应位置的元素为逻辑值1时表示该同学的成绩在区间[60,80)内,为逻辑值0时表示成绩在区间[60,80)外。

答案如下:

A = randi([0,100],1,20)res = (A >= 60) & (A < 80)% 一定要注意:不能写成:60 <= A < 80哦!

如果要找出[0 , 60) ∪ [80 , 100]分的同学呢?

答案如下(下面两种方法都可以):

方法1:(A < 60) | (A >= 80)方法2:~((A >= 60) & (A < 80))

下面我们再来介绍MATLAB中另外两个使用频率很高的逻辑运算符:&&||.

这两个运算符和“逻辑与&”和“逻辑或|”作用相同,但它们有两个非常重要的区别:

(1)&&和||只能对标量(只有一个元素)进行逻辑运算,不能对有多个元素的向量或者矩阵进行运算,而&和|可以。比如我们上面那个练习题,你只能使用&和|进行运算。

(2)&&和||进行逻辑运算时具有短路功能,可以提高运行效率:

  • 计算A && B时,如果A为逻辑0,则B不会被判断,因为最后的结果一定是逻辑0;
  • 计算A || B时,如果A为逻辑1,则B不会被判断,因为最后的结果一定是逻辑1。

          

举个例子:假设a等于10,b等于3,现在要计算:(a+b < 10) && (a/b > 1),那么MATLAB首先会判断前面一项:(a+b < 10),因为这一项计算的结果为逻辑0,所以后面的(a/b > 1)这一项不会被计算,MATLAB会直接返回逻辑0;如果你使用的是:(a+b < 10) & (a/b > 1),那么这两项都会被计算,这样的话效率会低一点。在下一章中,我们会介绍if判断语句和while循环语句,和&、|相比,&&和||在if和while语句中使用频率更高。

思考题:前面我们介绍过logical函数,它能将数值转换为逻辑值,但如果输入的是NaN,那么MATLAB会报错,请大家思考:分别运行(10 > 3) | logical(NaN)和(10 > 3) || logical(NaN)的结果是什么?

答案如下:

运行 (10 > 3) | logical(NaN) 会报错,因为前后两项都会被计算,所以当MATLAB运行到后面的logical(NaN)时会报错;运行 (10 > 3) || logical(NaN) 会返回逻辑1,因为前面一项(10>3)返回逻辑1,此时会触发||的短路机制,这时候就会直接返回逻辑1。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2776667.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

DBdoctor恭祝大家龙行龘龘,前程朤朤

值此新年之际&#xff0c;DBdoctor恭祝大家龙行龘龘&#xff0c;前程朤朤。尤其是当前还跟我一样奋斗在护航春节一线的战友们&#xff0c;祝愿大家2024年系统又快又稳。 今年是DBdoctor护航春晚的第三年&#xff0c;聚好看作为海信旗下的互联网科技公司&#xff0c;服务着海信…

利用Pybind11封装Python版的WiringPi!

原版的WiringPi是一个用于树莓派的GPIO库&#xff0c;用C语言开发&#xff0c;仓库地址&#xff1a;https://github.com/WiringPi/WiringPi。该库允许用户以编程方式访问和控制树莓派的GPIO引脚。而随着Python在嵌入式设备上的快速发展&#xff0c;其对底层引脚的操作也变得越来…

学习通考试怎么搜题找答案? #学习方法#微信#其他

大学生必备的做题、搜题神器&#xff0c;收录上万本教材辅助书籍&#xff0c;像什么高数、物理、计算机、外语等都有&#xff0c;资源十分丰富。 1.菜鸟教程 菜鸟教程是一个完全免费的编程学习软件。 它免费提供了HTML / CSS 、JavaScript 、服务端、移动端、XML 教程、http…

leetcode(滑动窗口)483.找到字符中所有字母异位词(C++详细解释)DAY4

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&a…

通俗易懂:快速排序算法全解析

快速排序&#xff08;Quick Sort&#xff09;是一种高效的分治排序算法&#xff0c;它以其出色的性能和广泛的应用而闻名。本文将深入讲解快速排序的原理、步骤和时间复杂度&#xff0c;并探讨其优势和应用场景。 快速排序原理 快速排序的核心思想是通过选择一个基准元素&…

springboot167基于springboot的医院后台管理系统的设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

Bee+SpringBoot稳定的Sharding、Mongodb ORM功能(同步 Maven)

Hibernate/MyBatis plus Sharding JDBC Jpa Spring data GraphQL App ORM (Android, 鸿蒙) Bee 小巧玲珑&#xff01;仅 860K, 还不到 1M, 但却是功能强大&#xff01; V2.2 (2024春节・LTS 版) 1.Javabean 实体支持继承 (配置 bee.osql.openEntityCanExtendtrue) 2. 增强批…

Vue源码系列讲解——虚拟DOM篇【三】(更新子节点)

1. 前言 在上一篇文章中&#xff0c;我们了解了Vue中的patch过程&#xff0c;即DOM-Diff算法。并且知道了在patch过程中基本会干三件事&#xff0c;分别是&#xff1a;创建节点&#xff0c;删除节点和更新节点。创建节点和删除节点都比较简单&#xff0c;而更新节点因为要处理…

“掌握温度,感知湿度,一触即知!”DHT11温湿度传感器,为您的生活增添一份关怀与精准。#非标协议【下】

“掌握温度&#xff0c;感知湿度&#xff0c;一触即知&#xff01;”DHT11温湿度传感器&#xff0c;为您的生活增添一份关怀与精准。#非标协议【下】 前言预备知识1.DHT11温湿度传感器初识1.1产品概述1.2与51单片机接线1.3数据传送逻辑和数据格式 2.发送时序检测DHT11温湿度传感…

npm 上传一个自己的应用(3) 在项目中导入及使用自己上传到NPM的工具

上文 npm 上传一个自己的应用(2) 创建一个JavaScript函数 并发布到NPM 我们创建了一个函数 并发上了npm 最后 我们这里 我们可以看到它的安装指令 这里 我们可以打开一个vue项目 终端输入 我们的安装指令 npm i 自己的包 如下代码 npm i grtest我们在 node_modules目录 下…

[C#]winform制作仪表盘好用的表盘控件和使用方法

【仪表盘一般创建流程】 在C#中制作仪表盘文案&#xff08;通常指仪表盘上的文本、数字或指标显示&#xff09;涉及到使用图形用户界面&#xff08;GUI&#xff09;组件&#xff0c;比如Windows Forms、WPF (Windows Presentation Foundation) 或 ASP.NET 等。以下是一个使用W…

Linux网络通信——TCP/OSI七层模型/TCP/IP(五层或四层模型)/HTTP报文传输原理

文章目录 消息的传输什么是OSI七层模型OSI七层模型的内容物理层&#xff08;Physical Layer&#xff09;&#xff1a;数据链路层&#xff08;Data Link Layer&#xff09;&#xff1a;网络层&#xff08;Network Layer&#xff09;&#xff1a;传输层&#xff08;Transport Lay…

vue3-内置组件-Teleport

Teleport <Teleport> 是一个内置组件&#xff0c;它可以将一个组件内部的一部分模板“传送”到该组件的 DOM 结构外层的位置去。 基本用法 有时我们可能会遇到这样的场景&#xff1a;一个组件模板的一部分在逻辑上从属于该组件&#xff0c;但从整个应用视图的角度来看…

实现注册登录时数据的加密传输(含前后端具体代码)

前言 http/https协议提交在被抓包时请求内容是明文的, 直接传输账号密码的风险非常大&#xff0c;故这里我们要对数据加密处理&#xff0c;并生成校验码&#xff0c;防止数据篡改 目录 ​编辑 前言 具体思路 代码实现 前端信息加密处理&#xff08;Vue&#xff09; 安装…

Java多线程:线程安全

&#x1f451;专栏内容&#xff1a;Java⛪个人主页&#xff1a;子夜的星的主页&#x1f495;座右铭&#xff1a;前路未远&#xff0c;步履不停 目录 一、线程状态1、New&#xff08;初始状态&#xff09;2、Terminated&#xff08;终止状态&#xff09;3、Runnable&#xff08;…

C++类型转化cast from pointer to smaller type ‘int‘ loses information

代码如下 #include <iostream>int main() {int a 10;std::cout << (int)&a << std::endl;return 0; }编译 这段代码是要将地址转化成整数类型&#xff0c;但是在编译时编译器告诉我们这是错的&#xff0c;因为在C中&#xff0c;将指针转换为int类型的…

Spring基础 - Spring核心之面向切面编程(AOP)

Spring基础 - Spring核心之面向切面编程(AOP) 引入 Spring 框架通过定义切面, 通过拦截切点实现了不同业务模块的解耦&#xff0c;这个就叫面向切面编程 - Aspect Oriented Programming (AOP)那么Spring框架又是如何实现AOP的呢&#xff1f; 这就引入代理技术&#xff0c;分静…

Sqlite3安装步骤

1、Sqlite3以下载文件&#xff0c;配置环境变量的方式进行安装。 2、下方链接为官方的下载地址。 sqlite下载地址 2.1、需要两个下载文件&#xff0c;解压后将他们放在一起&#xff0c;假设解压后的路径为E:\sqlite。 sqlite-dll-win-x64-3450100.zip sqlite-tools-win-x6…

C++自定义函数详解

个人主页&#xff1a;PingdiGuo_guo 收录专栏&#xff1a;C干货专栏 铁汁们新年好呀&#xff0c;今天我们来了解自定义函数。 文章目录 1.数学中的函数 2.什么是自定义函数 3.自定义函数如何使用&#xff1f; 4.值传递和引用传递&#xff08;形参和实参区分&#xff09; …

OLED调试简介

文章目录 一、介绍调试方法介绍OLED简介硬件电路OLED驱动函数 二、操作连接线路使用驱动函数显示内容 OLED.c的内容 一、介绍 调试方法介绍 OLED简介 硬件电路 OLED驱动函数 二、操作 连接线路 因为这两个引脚不做配置是浮空状态&#xff0c;在这里直接用电源给OLED供电 使…