009_lhs_rhs_in_Matlab中的左值和右值约定

news/2024/4/28 12:12:33/文章来源:https://blog.csdn.net/withstand/article/details/137131662

Matlab中的左值和右值约定

1. 左值和右值

我们在把Matlab作为计算器来使用时,有些时候会直接列出一个表达式,等着Matlab打印出计算结果。就这个简单的举动,在计算机科学中,也有一个高大上的名字,叫什么REPL(Read-Eval-Print Loop)。

你们以后如果在拿Matlab作为计算器使用,别人问你们在干什么,你们就可以说,我在利用Matlab的REPL功能进行快速原型开发与验证。

我在好多本书里看到对REPL的意义的解释,基本上都是这样的:REPL是一种交互式编程环境,它可以让你快速地输入表达式,然后立即看到计算结果。这种交互式的编程环境,可以让你快速地验证你的想法,快速地进行原型开发。关于REPL的意义,大厨们简直能写一本书,哦不,几本书。

但是作为一个计算器,Matlab最强大的不是能算一些数,它还能把中间的计算结果保存下来,然后再利用这些计算结果进行下一步的计算。这就涉及到了一个概念,叫做左值和右值。

a = 1;
b = 2;c = a + b;

在Matlab这样的语言中,变量不需要声明,变量的类型也不固定,虽然每个变量在赋值之后的确有一个类型。

在Matlab中,变量的大小和类型信息可以用whos命令查看。

whos
>> whosName      Size            Bytes  Class     Attributesa         1x1                 8  double              b         1x1                 8  double              c         1x1                 8  double              

这跟我们在草稿纸上进行数字计算的时候,把中间结果写在草稿纸上,然后再利用这些中间结果进行下一步计算是一样的。只不过,我们通常会是这样。

在这里插入图片描述

高级计算器Matlab除了REPL功能之外,还提供了一种设定变量的值的功能。一个设定变量值的语句称为表达式。在Matlab中,表达式的一般形式是:

左值 = 右值

从这里,就可以定义左值和右值。

  • 左值:左值是一个变量,它是一个存储位置,用来存储右值的计算结果。
  • 右值:右值是一个表达式,它是一个计算过程,用来计算出一个值。

2. 作为左值的变量

那么那些东西可以作为左值呢?这就设计到另外一个概念,类型。在一个强类型的编程语言(计算环境)中,一个左值的类型是一个重要的概念,通过类型才能确定变量的存储位置的大小和存储方式。

从我们前面的whos命令的输出可以看到,Matlab中的变量有一个属性叫做Class,这个属性就是变量的类型。

那么,Matlab中的变量的类型有哪些呢?通过class函数可以查看一个变量的类型。查看help class可以看到Matlab中的数据类型。

>> help classclass  Return class name of object.S = class(OBJ) returns the name of the class of     object OBJ.Possibilities are:double          -- Double precision floating     point number array(this is the traditional     MATLAB matrix or array)single          -- Single precision floating     point number arraylogical         -- Logical arraychar            -- Character arraycell            -- Cell arraystruct          -- Structure arrayfunction_handle -- Function Handleint8            -- 8-bit signed integer arrayuint8           -- 8-bit unsigned integer arrayint16           -- 16-bit signed integer arrayuint16          -- 16-bit unsigned integer arrayint32           -- 32-bit signed integer arrayuint32          -- 32-bit unsigned integer arrayint64           -- 64-bit signed integer arrayuint64          -- 64-bit unsigned integer array<class_name>    -- MATLAB class name for MATLAB     objects<java_class>    -- Java class name for java     objects

从这里可以看到Matlab的基本数据类型。那么问题来了,作为左值的变量的类型从哪里来?

一个明显的来源就是从设置变量值的表达式中的右值的类型来决定,a = 11的类型是double,所以a的类型也是double。那么还有没有其他决定变量类型的方法呢?那就是Matlab的索引过程中的约定。

这里还有一个很奇怪的现象,就是Matlab没有数组或者矩阵类型。

约定:Matlab中的所有基础变量都是数组,最平常的就是size为1的数组。

>> cellfun(@class, {1, [1], [1,1], [1,1;1,1]}, 'UniformOutput', false)ans =1×4 cell 数组{'double'}    {'double'}    {'double'}    {'double'}

这个例子可以看到,这几个变量的类型都是double,他们的不同在于size

>> cellfun(@size, {1, [1], [1,1], [1,1;1,1]}, 'UniformOutput', false)ans =1×4 cell 数组{[1 1]}    {[1 1]}    {[1 2]}    {[2 2]}

这里还可以看到,1[1]是同一个东西。

>> 1 == [1]ans =logical1

这就是为什么Matlab的名字是Matrix Laboratory的原因,所有的基础变量都是矩阵,都作为数组来处理。

3. 作为左值的数组

当所有基础类型(数值、字符、逻辑)都是数组的时候,数组也可以作为左值。这个时候,前面我们所讲的索引的各个约定就有非常重要的作用了。

我们可以通过索引,把一个数组的一部分作为左值来赋值。这个实际上不是一个很简单的操作。

A = magic(3);A(1,1) = 1; % 单个元素的左值A(1,:) = 1; % 一行的左值A(:,1) = 1; % 一列的左值A(1:2,1:2) = 1; % 一个矩形区域的左值

这里的A(1,1)A(1,:)A(:,1)A(1:2,1:2)都是左值,它们都是数组的一部分。这里还有一个并不简单的事情,就是这四个表达式的右边的值都是1,但是它们的大小是不同的。这就是Matlab的广播约定。

约定:当一个表达式的左值numel大于1,右值是size[1,1],右值会被拷贝到左值的每一个元素,称为广播。

对于上面这个例子中的矩阵索引构成的左值,是Matlab中的一个非常重要的特性。在这个赋值过程中,有两种情况:

  1. 右值的numel等于左值的numel,这个时候,右值会被依次拷贝到左值,这个顺序我猜测是按照sub2ind的顺序。
  2. 右值的numel等于1,这个时候,右值会被广播到左值的每一个元素。

4. 作为右值的表达式

Matalb表达式的右值,归根揭底就只有3种形式:

  1. 字面常量,比如1'a'true[1,2,3]
  2. 矩阵索引,比如A(1,1)A(1,:)A(:,1)A(1:2,1:2)
  3. 函数调用,比如sin(1)magic(3)、ones(3,2)`。

那我们平常在Matlab中写的表达式,比如a + bA * B中的+*是什么呢?只需要在Matlab中输入help +就能看到+的帮助文档。

>> help ++   Plus.A + B adds arrays A and B. A and B must have the same size unless one is a scalar.A scalar can be added to a matrix of any size.C = PLUS(A,B) is called for the syntax 'A + B' when A or B is an object.See also: plus, minus, uplus, uminus, mtimes, times, rdivide, ldivide, power.

所有的运算符都是函数,这些函数都是Matlab的内置函数。

5. 结论

  1. RPEL是一个交互式编程环境,可以快速验证想法,进行原型开发。
  2. Matlab中的所有基础变量都是数组,最平常的就是size为1的数组。
  3. Matlab中的变量的类型是通过右值的类型或者矩阵索引来决定的。
  4. 广播是Matlab中的一个重要特性,就是把一个标量广播到一个数组的每一个元素。
    数。

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

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

相关文章

OpenCV 如何使用 XML 和 YAML 文件的文件输入和输出

返回&#xff1a;OpenCV系列文章目录&#xff08;持续更新中......&#xff09; 上一篇&#xff1a;如何利用OpenCV4.9离散傅里叶变换 下一篇: 目标 本文内容主要介绍&#xff1a; 如何使用 YAML 或 XML 文件打印和读取文件和 OpenCV 的文本条目&#xff1f;如何对 OpenCV …

mysql--事务四大特性与隔离级别

事务四大特性与隔离级别 mysql事务的概念事务的属性事务控制语句转账示例 并发事务引发的问题脏读脏读场景 不可重复读幻读幻读场景 事务的隔离级别读未提交读已提交可重复读&#xff08;MySQL默认&#xff09; 总结 mysql事务的概念 事务就是一组操作的集合&#xff0c;他是一…

Unbtun-arach64架构安装PySide2(python3.6)

aarch平台是无法通过pip安装PySide2的&#xff0c;同时利用源码下载一直报错 1. 我是python3.6.9&#xff0c;在官网上找到对应的PySide2版本 5.15.2.所以首先在官网下载Qt5.15.2的源码&#xff1a;https://download.qt.io/archive/qt/5.15/5.15.2/single/ 2. 编译qt环境 aar…

win11蓝牙图标点击变灰,修复过程

问题发现 有一天突然心血来潮想着连接蓝牙音响放歌来听,才发现win11系统右下角菜单里的蓝牙开关有问题。 打开蓝牙设置,可以正常直接连上并播放声音,点击右下角菜单里的蓝牙开关按钮后,蓝牙设备也能正常断开,但是按钮直接变深灰色,无法再点击打开。 重启电脑,蓝牙开关显…

Parade Series - SVG Resource

iconfont https://www.iconfont.cn/?spma313x.search_index.i3.2.74e53a819tkkcG音符 <div class"form-group"><a href"Javascript:reload();" class"btn btn-icon btn-outline-light btn-block" style";"><svg t&q…

Docker命令及部署Java项目

文章目录 简介Docker镜像镜像列表查找镜像拉取镜像删除镜像镜像标签 Docker容器容器启动容器查看容器停止和重启后台模式和进入强制停止容器清理停止的容器容器错误日志容器别名及操作 Docker部署Java项目 简介 Docker是一种容器化技术&#xff0c;可以帮助开发者轻松打包应用…

学透Spring Boot — [二] Spring 和 Spring Boot的比较

欢迎关注我们的专栏 学透 Spring Boot 一、创建一个简单Web应用 本篇文章&#xff0c;我们将会比较 Spring 框架和 Spring Boot 的区别。 什么是 Spring? 也许你在项目中已经可以很熟练的使用 Spring 了&#xff0c;但是当被问到这个问题时&#xff0c;会不会犹豫一下&#…

SQLyog连接MySQL8.0+报错:错误码2058的解决方案

最近把mysql从5.7迁移到8.3.0发现连接不上 因为 MySQL 从 8.0 版本开始&#xff0c;新增了caching_sha2_password授权插件 技术博客 http://idea.coderyj.com/ 1.更换sqlyog 更新到13.1.3之后的版本 2.取消mysql8的加密授权机制 mysql> ALTER USER sqlyog% IDENTIFIED WIT…

Nginx【概述:网页服务器 并发能力强】【常见命令】【部署实战】【反向代理】

Nginx-概述 介绍下载和安装下载安装重点目录和文件如下 Nginx-命令常用命令1). 查看版本2). 检查配置文件3). 启动4). 停止5). 重新加载 环境变量配置 Nginx-应用配置文件结构部署静态资源介绍测试1). 将静态资源上传到 /usr/local/nginx/html 目录2). 启动nginx3). 访问4). 配…

栈和队列——c语言实现栈

本节复习栈和队列中栈的增删查改。 首先回顾一下栈的性质&#xff1a; 栈的存储数据的原则是“后入先出”&#xff0c; 先入的在栈底&#xff1b; 后入的在栈顶。&#xff0c;弹出数据时在栈顶弹出。 目录 准备文件 创建栈的结构体蓝图 栈的初始化 入栈 出栈 获取栈顶元素 获…

MoonBit MeetUp回顾——张正、宗喆:编程语言在云原生与区块链领域的技术探索

宗喆和张正分别给我们带了 KCL 相关的最新进展&#xff0c;由蚂蚁集团开发的 Rust 编写的开源 DSL&#xff0c;目标是优化云原生策略配置和用户体验。它通过引入动态配置管理、配置校验和基础设施抽象等核心概念&#xff0c;解决开发者认知负担、配置膨胀和标准化工具缺乏的问题…

目标检测的相关模型图:YOLO系列和RCNN系列

目标检测的相关模型图&#xff1a;YOLO系列和RCNN系列 前言YOLO系列的图展示YOLOpassthroughYOLO2YOLO3YOLO4YOLO5 RCNN系列的图展示有关目标检测发展的 前言 最近好像大家也都在写毕业论文&#xff0c;前段时间跟朋友聊天&#xff0c;突然想起自己之前写画了一些关于YOLO、Fa…

自己编译SQLite或将SQLite移植到新的操作系统(六)

返回&#xff1a;SQLite—系列文章目录 上一篇:SQLite中的动态内存分配&#xff08;五&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 1.0 引言 对于大多数应用程序&#xff0c;推荐的构建方法 SQLite是使用合并代码 文件 sqlite3.c 及其相应的头文件 sqlite3.…

C# OpenCvSharp 轮廓检测

目录 效果 代码 下载 效果 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using OpenCvSharp; using OpenCvSharp.…

k8s1.28.8版本配置prometheus监控告警

文章目录 官方架构图组件的具体介绍kube-prometheus包含的组件简介&#xff1a;文件存储路径&#xff1a; 结构分析官网自带的一些规则自己总结流程 1-创建规则磁盘使用率报警规则 详解上面rule流程Alertmanagerg查看 2-报警接收器2.1-邮件报警修改Alertmanager配置查看现有的s…

实战|使用 Node.js 和 htmx 构建全栈应用程序

在本教程中&#xff0c;我将演示如何使用 Node 作为后端和 htmx 作为前端来构建功能齐全的 CRUD 应用程序。这将演示 htmx 如何集成到全栈应用程序中&#xff0c;使您能够评估其有效性并确定它是否是您未来项目的不错选择。 htmx 是一个现代 JavaScript 库&#xff0c;旨在通过…

Haproxy2.8.1+Lua5.1.4部署,haproxy.cfg配置文件详解和演示

目录 一.快速安装lua和haproxy 二.配置haproxy的配置文件 三.配置haproxy的全局日志 四.测试负载均衡、监控和日志效果 五.server常用可选项 1.check 2.weight 3.backup 4.disabled 5.redirect prefix和redir 6.maxconn 六.调度算法 1.静态 2.动态 一.快速安装lu…

【python】网络编程socket TCP UDP

文章目录 socket常用方法TCP客户端服务器UDP客户端服务器网络编程就是实现两台计算机的通信 互联网协议族 即通用标准协议,任何私有网络只要支持这个协议,就可以接入互联网。 socket socke模块的socket()函数 import socketsock = socket.socket(Address Family, type)参…

推动制药行业数字化转型:基于超融合架构的MES一体机解决方案

随着中国对信息化重视程度的不断加深&#xff0c;制药行业作为国民经济的重要支柱之一&#xff0c;也在积极寻求通过数字化手段提升产业效率与产品质量。自党的十六大提出“以信息化带动工业化”的战略以来&#xff0c;制药业的这一转型探索尤为迫切。 在现代制药生产中&#…

scala-idea环境搭建及使用

环境搭建 创建一个新项目&#xff0c;选择maven工程 点击next&#xff0c;写入项目名&#xff0c;然后finish 注意&#xff1a;默认下&#xff0c;maven不支持scala的开发&#xff0c;需要引入scala框架&#xff0c;右键项目点击-》add framework pport....&#xff0c;在下图…