009_lhs_rhs_in_Matlab中的左值和右值约定

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
>> whos
  Name      Size            Bytes  Class     Attributes

  a         1x1                 8  double              
  b         1x1                 8  double              
  c         1x1                 8  double              

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

在这里插入图片描述

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

左值 = 右值

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

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

2. 作为左值的变量

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

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

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

>> help class
 class  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 array
      logical         -- Logical array
      char            -- Character array
      cell            -- Cell array
      struct          -- Structure array
      function_handle -- Function Handle
      int8            -- 8-bit signed integer array
      uint8           -- 8-bit unsigned integer array
      int16           -- 16-bit signed integer array
      uint16          -- 16-bit unsigned integer array
      int32           -- 32-bit signed integer array
      uint32          -- 32-bit unsigned integer array
      int64           -- 64-bit signed integer array
      uint64          -- 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 =

  logical

   1

这就是为什么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中的一个重要特性,就是把一个标量广播到一个数组的每一个元素。
    数。

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

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

相关文章

缓冲区溢出漏洞学习总结(漏洞原理及其利用方法)

文章目录 前言1、缓冲区溢出漏洞概述1.1、漏洞概述1.2、缓冲区溢出漏洞概述1.3、缓冲区溢出攻击概述1.4、引发缓冲区溢出的原因 2、栈溢出漏洞2.1、栈溢出漏洞概述2.2、栈溢出漏洞利用2.2.1、利用方法一&#xff1a;修改返回地址2.2.2、利用方法二&#xff1a;覆盖临接变量 3、…

多视图三维重建-SFM简介

背景 掌握传统的多视图三维重建基本流程 总体流程 多视图三维重建的Pipieline如下图&#xff0c;总共分为四个步骤&#xff1a; 拍摄场景多视角的图像建立这些图像之间的联系&#xff08;Data Association&#xff09;SFM稀疏重建MVS稠密重建 Data Association 建立图像…

第十二章 微服务核心(一)

一、Spring Boot 1.1 SpringBoot 构建方式 1.1.1 通过官网自动生成 进入官网&#xff1a;https://spring.io/&#xff0c;点击 Projects --> Spring Framework&#xff1b; 拖动滚动条到中间位置&#xff0c;点击 Spring Initializr 或者直接通过 https://start.spring…

QT_day3:信号和槽的连接方式

1、使用手动连接&#xff0c;将登录框中的取消按钮使用qt4版本的连接到自定义的槽函数中&#xff0c;在自定义的槽函数中调用关闭函数 将登录按钮使用qt5版本的连接到自定义的槽函数中&#xff0c;在槽函数中判断ui界面上输入的账号是否为"admin"&#xff0c;密码是…

嵌入式3-29

今日作业&#xff1a;用fwrite 和 fseek功能&#xff0c;将一张bmp格式的图片更改成 德国国旗#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> typedef unsigned char bgr[3]; int main(int argc, const char *argv[])…

用grafana+prometheus+cadvisor监控容器指标数据,并查询当前容器的网速网络用量

前言 整理技术&#xff0c;在这篇文章中&#xff0c;将会搭建grafanaprometheuscadvisor监控容器&#xff0c;并使用一个热门数据看板&#xff0c;再监控容器的性能指标 dashboard效果 这个是node-exporter采集到的数据&#xff0c;我没装node-exporter&#xff0c;而且这也…

3D人体姿态估计项目 | 从2D视频中通过检测人体关键点来估计3D人体姿态实现

项目应用场景 人体姿态估计是关于图像或视频中人体关节的 2D 或 3D 定位。一般来说&#xff0c;这个过程可以分为两个部分&#xff1a;(1) 2D 视频中的 2D 关键点检测&#xff1b;(2) 根据 2D 关键点进行 3D 位姿估计。这个项目使用 Detectron2 从任意的 2D 视频中检测 2D 关节…

【滑动窗口】Leetcode 将 x 减到 0 的最小操作数

题目解析 1658. 将 x 减到 0 的最小操作数 算法讲解 这道题按照题目要求的话会变得很难&#xff0c;因为不仅需要考虑数字减到0&#xff0c;还需要考虑最小的操作数。正难则反&#xff0c;按照这个思路&#xff0c;我们来解析题目 这道题本质上无非就是在左边寻找一段区间&a…

【每日算法】理论: 扩散模型+深度学习基础 刷题:力扣哈希表回顾

上期文章 【每日算法】理论&#xff1a; DALLE 系列 刷题&#xff1a;力扣链表回顾 文章目录 上期文章一、上期问题二、本期问题1、交叉熵损失函数2、SAM模型的mask encoder&#xff08;掩码解码器&#xff09;3、VQVAE的优化问题4、controlnet模型中的zero convolution模块5、…

浪潮信息AIStation与潞晨科技Colossal-AI 完成兼容性认证!

为进一步提升大模型开发效率&#xff0c;近年来&#xff0c;浪潮信息持续加强行业合作&#xff0c;携手业内头部&#xff0c;全面进攻大模型领域。日前&#xff0c;浪潮信息AIStation智能业务创新生产平台与潞晨科技Colossal-AI大模型开发工具完成兼容性互认证。后续&#xff0…

边缘计算盒子 | 什么是边缘计算盒子?选型要看哪些参数?

边缘计算(Edge Computing)是一种分布式计算范式&#xff0c;它将计算资源和数据存储位于离网络核心节点较近的地方&#xff0c;以降低延迟、提高传输速度和数据安全性。通常可以把边缘计算盒子(Edge Computing Box)理解成一种集成了边缘计算功能的硬件设备&#xff0c;通常部署…

SD 修复 Midjourney 有瑕疵照片

Midjourney V6 生成的照片在质感上有了一个巨大的提升。下面4张图就是 Midjourney V6 生成的。 如果仔细观察人物和老虎的面部&#xff0c;细节真的很丰富。 但仔细观察上面四张图的手部细节&#xff0c;就会发现至少有两只手是有问题的。这也是目前所有 AI 绘图工具面临的问题…

第十二章 微服务核心(二)

一、Spring Cloud 1. 服务注册中心 常见的服务注册中心组件如下 - Eureka - Consul - Zookeeper - Etcd - Nacos 2. Eureka SpringCloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理。 什么是服务治理&#xff1a;在传统的 RPC 远程调用框架中&#xff0c;管…

SQLite中的隔离(八)

返回&#xff1a;SQLite—系列文章目录 上一篇&#xff1a;SQLite版本3中的文件锁定和并发(七&#xff09; 下一篇&#xff1a;SQLite—系列文章目录 数据库的“isolation”属性确定何时对 一个操作的数据库对其他并发操作可见。 数据库连接之间的隔离 如果使用两个不…

SpringBoot整合参数校验

✅作者简介:大家好,我是Leo,热爱Java后端开发者,一个想要与大家共同进步的男人😉😉🍎个人主页:Leo的博客💞当前专栏: 循序渐进学SpringBoot ✨特色专栏: MySQL学习 🥭本文内容:SpringBoot整合参数校验 📚个人知识库: Leo知识库,欢迎大家访问 目录 1.前言…

关于github提交失败的问题

问题描述 Username for https://github.com: LAL-Better Password for https://LAL-Bettergithub.com: remote: Support for password authentication was removed on August 13, 2021. remote: Please see https://docs.github.com/get-started/getting-started-with-git/abo…

QT资源添加调用

添加资源文件&#xff0c;新建资源文件夹&#xff0c;命名resource&#xff0c;然后点下一步&#xff0c;点完成 资源&#xff0c;右键add Prefix 添加现有文件 展示的label图片切换 QLabel *led_show; #include "mainwindow.h" #include<QLabel> #include&l…

Python应用JSON Web Tokens库之pyjwt使用详解

概要 JSON Web Tokens(JWT)是一种用于安全传输信息的开放标准(RFC 7519),它可以在网络应用之间传递声明。PyJWT是Python中用于创建、解析和验证JWT的库,它提供了丰富的功能和灵活性,能够轻松地在Python应用程序中实现JWT的各种功能。本文将深入探讨PyJWT库的各个方面,…

再见 mysql_upgrade

在数据库管理的世界里&#xff0c;随着技术的不断进步和业务的不断发展&#xff0c;数据库的版本升级成为了一个不可避免的过程。 MySQL 作为业界领先的开源关系型数据库管理系统&#xff0c;其版本迭代与功能优化同样不容忽视。 而在这个过程中&#xff0c;升级工具就显得尤为…

若依微服务nacos配置在哪里?

今天拿ruoyi-cloud项目拉下来看了下&#xff0c;发现nacos配置文件比较难找&#xff0c;这里说一下在哪里。 在项目sql脚本ry_config_20231204.sql里面&#xff0c;这个脚本执行会创建一个数据库叫ry-config。 安装好nacos以后&#xff0c;在nacos的配置文件application.proper…