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://www.mfbz.cn/a/379560.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java基础常见面试题总结-集合(一)

常见的集合有哪些&#xff1f; Java集合类主要由两个接口Collection和Map派生出来的&#xff0c;Collection有三个子接口&#xff1a;List、Set、Queue。 Java集合框架图如下&#xff1a; List代表了有序可重复集合&#xff0c;可直接根据元素的索引来访问&#xff1b;Set代表…

寒假作业-day7

1>现有文件test.c\test1.c\main.c , 请编写Makefile. 代码&#xff1a; CCgcc EXEstr OBJS$(patsubst %.c,%.o,$(wildcard *.c)) CFLAGS-c -oall:$(EXE)$(EXE):$(OBJS)$(CC) $^ -o $%.o:%.c$(CC) $(CFLAGS) $ $^head.o:head.hclean:rm $(OBJS) $(EXE) 2>C编程实现&…

Uniapp(uni-app)学习与快速上手教程

Uniapp&#xff08;uni-app&#xff09;学习与快速上手教程 1. 简介 Uniapp是一个跨平台的前端框架&#xff0c;允许您使用Vue.js语法开发小程序、H5、安卓和iOS应用。下面是快速上手的步骤。 2. 创建项目 2.1 可视化界面创建 1、打开 HBuilderX&#xff0c;这是一款专为uni…

docker 基于容器创建本地web容器化镜像

一、docker 基于容器创建本地web容器化镜像 1、启动指定buysbox 镜像 docker run --name b1 -it busybox:latest 2、创建目录&#xff0c;并创建html mkdir -p /data/html vi index.html 内容自定义例如&#xff1a;<h1>welcome to busybox<h1> 3、新增窗口&am…

基于麻雀优化算法优化XGBoost参数的优化控制策略

目录 一、背景 二、算法流程图 三、附录 一、背景 为提高极端梯度提升&#xff08;Extreme Gradient Boosting, XGBoost&#xff09;集成算法在时间预测、信贷风险预测、工件参数预测、故障诊断预测等方面中的准确性&#xff0c;研究者提出了一种改进的麻雀算法&#xff08;…

leetcode:62.不同路径

动态规划 注意&#xff1a;用深搜或者广搜会超时 dp含义dp[i,j]&#xff1a;从&#xff08;0&#xff0c;0&#xff09;到&#xff08;i&#xff0c;j&#xff09;的路径个数 递推公式&#xff1a;dp[i][j] dp[i-1][j] dp[i][j-1] 初始化&#xff1a;for(i 0,i<m,i) …

python_蓝桥杯刷题记录_笔记_全AC代码_入门4

题单目录 1.P1914 小书童——凯撒密码 2.P1028 [NOIP2001 普及组] 数的计算 3.P1036 [NOIP2002 普及组] 选数 4.P1149 [NOIP2008 提高组] 火柴棒等式 5.P1217 [USACO1.5] 回文质数 Prime Palindromes 6.P1478 陶陶摘苹果&#xff08;升级版&#xff09; 7.P1618 三连击&…

移动端设置position: fixed;固定定位,底部出现一条缝隙,不知原因,欢迎探讨!!!

1、问题 在父盒子中有一个子盒子&#xff0c;父盒子加了固定定位&#xff0c;需要子盒子上下都有要边距&#xff0c;用margin或者padding挤开时&#xff0c;会出现缝隙是子盒子背景颜色的。 测试过了&#xff0c;有些手机型号有&#xff0c;有些没有&#xff0c;微信小程序同移…

数字图像处理实验记录六(图像的傅里叶变换和频域处理)

前言&#xff1a; 一、基础知识 1&#xff0c;傅里叶变换是什么 傅里叶变换是一种线性积分变换&#xff0c;通俗来说&#xff0c;通过傅里叶变换就是把一段信号分解成若干个简谐波。 二、实验要求 1&#xff0e;产生一幅如图所示亮块图像f(x,y)&#xff08;256256 大小、…

[UI5 常用控件] 08.Wizard,NavContainer

文章目录 前言1. Wizard1.1 基本结构1.2 属性1.2.1 Wizard&#xff1a;complete1.2.2 Wizard&#xff1a;finishButtonText1.2.3 Wizard&#xff1a;currentStep1.2.4 Wizard&#xff1a;backgroundDesign1.2.5 Wizard&#xff1a;enableBranching1.2.6 WizardStep&#xff1a;…

[红日靶机渗透] ATKCK红队评估实战靶场三

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【ATK&CK红队评估实战靶场】 【VulnHub靶场复现】【面试分析】 &#x1f…

Ubuntu22.04 gnome-builder gnome C 应用程序习练笔记(一)

一、序言 gnome-builder构建器是gnome程序开发的集成环境&#xff0c;支持主力语言C, C, Vala, jscript, python等&#xff0c;界面以最新的 gtk 4.12 为主力&#xff0c;将其下版本的gtk直接压入了depreciated&#xff0c;但gtk4.12与普遍使用的gtk3有很大区别&#xff0c;原…

【C++】引用与内联

个人主页 &#xff1a; zxctsclrjjjcph 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 引用2.1 引用概念2.2 引用使用场景2.3 引用特性2.4 引用和指针的区别2.5 传值、传引用效率比较2.5.1 值和引用的作为返回值类型的性能比较 3. 内联函数3.1 …

Vue事件中如何使用 event 对象

在Vue中&#xff0c;事件处理函数常常需要获取事件触发时的相关信息&#xff0c;比如鼠标位置、按键信息等。而要获取这些信息&#xff0c;就需要使用event对象。那么在Vue的事件中如何正确使用event对象呢&#xff1f;接下来就来详细介绍一下。 首先&#xff0c;在Vue的事件中…

JUC-并发面试题

一、基础 1、为什么要并发编程 充分利用多核CPU的资源2、并发编程存在的问题 上下文切换:PU通过时间片分配算法来循环执行任务,当前任务执行一个时间片后会切换到下一个任务。在切换前会保存上一个任务的状态,以便下次切换回这个任务时,可以再加载这个任务的状态。任务从保…

国考试题答案?五个不限次的公众号和软件分享啦! #学习方法#学习方法

在如今的智能化时代&#xff0c;我们的生活离不开手机&#xff0c;有许多工具能让生活更加方便&#xff0c;那么今天小招就介绍几款&#xff0c;在大学生活中常用的软件&#xff0c;给即将到来的小萌新们 1.灵兔搜题 这个是公众号 题库内容丰富全面&#xff0c;细致分类整理…

PySpark(三)RDD持久化、共享变量、Spark内核制度,Spark Shuffle、Spark执行流程

目录 RDD持久化 RDD 的数据是过程数据 RDD 缓存 RDD CheckPoint 共享变量 广播变量 累加器 Spark 内核调度 DAG DAG 的宽窄依赖和阶段划分 内存迭代计算 Spark是怎么做内存计算的? DAG的作用?Stage阶段划分的作用? Spark为什么比MapReduce快&#xff1f; Spa…

Qt网络编程-TCP与UDP

网络基础 TCP与UDP基础 关于TCP与UDP的基础这里就不过多介绍了&#xff0c;具体可以查看对应百度百科介绍&#xff1a; TCP&#xff08;传输控制协议&#xff09;_百度百科 (baidu.com) UDP_百度百科 (baidu.com) 需要知道这两者的区别&#xff1a; 可靠性&#xff1a; TC…

报道|2024 INFORMS Franz Edelman奖决赛名单

编者按 近日&#xff0c;2024年INFORMS Franz Edelman奖公布了决赛名单。Franz Edelman奖旨在促进能拯救生命、节省金钱以及解决问题的研究。决赛名单包含了零售、航空、食物供应链以及可持续发展等领域的优秀研究。 NFORMS近日发文&#xff0c;公布了进入2024 INFORMS Franz E…

如何在 emacs 上开始使用 Tree-Sitter (archlinux)

文章目录 如何在emacs上开始使用Tree-Sitter&#xff08;archlinux&#xff09; 如何在emacs上开始使用Tree-Sitter&#xff08;archlinux&#xff09; 在archlinux上使用比windows上不知道要方便多少倍&#xff01; $ sudo pacman -S emacs $ sudo pacman -S tree-sitter这里…
最新文章