百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 热门文章 > 正文

轻松掌握MATLAB - 2.1 数组的基本概念

bigegpt 2024-09-16 12:22 5 浏览

上一篇:轻松掌握MATLAB - 1.4 MATLAB基本语法


与许多其他编程语言中以单个的数为基本操作单元不同,MATLAB中以数组(array)为基本数据单元。所谓数组,就是一定数量的数据的序列,数组中的单个数据称为数组的元素。MATLAB是Matrix Laboratory的缩写,而矩阵(matrix)是二维数组。只有学会基于数组来思考问题,而不是像其他语言中去通过循环来逐个处理数据,才能发挥MATLAB的优势。MATLAB中的一切数据都是数组,支持所有基本数据类型和用户自定义类。本章我们主要以数值型和字符型数组为例,来介绍数组的基本概念,学习数组的创建、索引和变换等基本操作。对其他类型的数组,这些概念和基本操作是通用的,在下一章学习MATLAB基本数据类型时将会进行针对性的介绍。

MATLAB支持2到n维的数组。维数大于2的数组统称为多维数组(Multi-dimensional array),而2维数组根据形状不同,在MATLAB中有专门的名称。


【说明】

  • 在接下来的学习中,对于首次出现的函数,请利用第一章学过的获取帮助的方法,查询和学习其基本功能和用法。
  • 建议在Live Editor中完成本教程中的练习。示例代码后的注释是对代码的说明,练习时可不必输入。

2.1.1 多维数组

MATLAB理论上支持任意维数的多维数组,但是维数越多越抽象,而且访问效率低,运算不方便。因此多维数组更多的是作为一种数据结构,用来存储特定数据。例如3维数组可以存储三维空间数据,图片的三基色数据,或二维空间数据的时间演化等。在索引多维数组中的元素时,多维数组的各个维度可以这样想象,[行,列,页,书,书架,....]。比如到一个4维数组中索引某个元素,相当于查找某本书中某一页上某行某列的文字。MATLAB提供了专门的函数来判断一个数组的维数、元素总个数和各维度的大小。

为了演示数组操作,在接下来的例子中,我们先用randi函数创建了一个50以内形状为2x5x2的随机整数数组ma,然后用ndims、numel、size函数获取数组的相关信息。

2.1.2 矩阵

二维的数组,称为矩阵(Matrix)。在MATLAB中,直接参与数值运算的数组基本都是矩阵,这也是这门语言被称为MATLAB的原因。

首先,用rand函数生成一个维度为3x5伪随机数矩阵m。然后,用size函数获取m的行和列数并分别赋值给变量row和col。

height和width函数是R2013b版本引入的函数,用来统计表的行和列数。从R2020b版本开始,这两个函数开始支持矩阵,分别返回矩阵的行数和列数。

length函数返回数组中最长维度的元素个数。

用ismatrix函数可以判断一个数组是否为矩阵。

可以看出,对于 m,ismatrix 函数返回逻辑值1,表示 m 是一个矩阵。而之前我们创建的 ma 是一个三维数组,ismatrix 函数对 ma 返回逻辑值0,这表明多维数组不是矩阵

2.1.3 向量

有1个维度长度是1的矩阵,称为向量(Vector)。其中,1×n的向量被称为行向量,n×1的向量被称为列向量。显然,向量是一种特殊的矩阵。例如,

方括号[ ]是数组的构造符号。在数组中,同行元素用逗号或空格分隔,不同行之间用分号或回车分隔。一对单引号' '是字符向量的构造符号,当字符数组只有一行时,可以省略方括号[ ]。使用 whos 函数可以查询刚定义的几个变量的属性。

MATLAB也提供了专门的is*函数来判断向量。例如,isvector函数可判断输入参数是否为向量:

isrow和iscolumn函数分别用来判断其输入参数是否为行向量和列向量:

由于vr是一个行向量,因此isrow(vr)返回逻辑值1,而iscolumn(vr)返回逻辑值0。字符向量vch也是一个行向量。

根据定义,向量应该是矩阵,字符向量也是矩阵。验证如下:

2.1.4 标量

两个维度的长度都是1的矩阵,称为标量(Scalar)。显然,标量是只有一个元素的数组。例如,

由于标量只有1个元素,定义符[]可以省略,但字符标量中的引号不可省略。MATLAB默认的数值类型为double。

用isscalar函数判断参数是否为标量。例如,

根据标量的定义,它应该既是向量,也是矩阵。验证如下:

思考一下:标量的维数应该是多少?该用哪个函数进行验证?

2.1.5 空数组

MATLAB中还有一种元素个数为0的特殊数组,称为空数组(Empty array)。空数组的元素个数为零,但其维度不为零,而是可以有2-n维的空数组。在一个数组中,只要有一个维度的长度为0,该数组即为空数组。例如,

请留意whos函数返回结果中的Size、Bytes和Class列。虽然数组em0两个维的长度都是0,但它的维度是2,因此是一个2维的空数组。

思考一下:根据定义,em0是标量、向量或矩阵吗?请用相应的is*函数验证你的判断。

通过直接输入的方法只能创建0x0的2空数组,但通过MATLAB提供的数组生成函数(例如,rand、ones、zeros、true、false、strings等),我们可以创建任意维度的空数组。例如,

可以看出,ema是一个3维的空数组。而emv是空向量,因为它有1个维度的长度是1,符合向量的定义。对于空数组,我们可以使用isempty函数进行判断。例如,

只要数组中有一个维度的长度为0,isempty函数即返回1。

数组是MATLAB中最基本的数据单元,MATLAB中一切数据皆为数组,因此无需isarray这样的函数。不同名称数组的包含关系如图2.1所示。向量、矩阵或多维数组都可能为空,但不存在空的标量。

2.1.6 数组中元素的下标与序号

数组中的元素可以通过下标或序号来确定其位置。所谓下标,是指元素所在的行、列、页、....中的坐标。在每一页中,坐标原点位于左上角,从1开始,向下、向右依次编号。所谓序号,则是元素在数组中的排列顺序。序号从第一页左上角的第一个元素开始,按照列优先的原则,从低维到高维连续编号。MATLAB不支持用相对位置来访问数组,下标和序号都是从1开始,并且不允许为负数。例如,对于一个3x3x3的数组,其元素的下标与序号的关系如图2.2所示。下标(2,3,1) 对应的为第1页第2行第3列的元素,其序号为8。在多维数组中,元素的序号是连续的,第一页按“列优先”的顺序排完后,从第二页左上角继续编号。


【说明】

  • MATLAB 最初是用Fortran编写的,继承了Fortran中“列优先”(逐列)的数组存取习惯。
  • 在多维数组中,第1维是纵向(列),第2维是横向(行),第3维是页,依此类推。
  • 多维数组在任意一个二维面上必须保持为矩形。例如矩阵,各行宽度要相等,各列的高度也要相等。在本教程中,为了表述方便,我们将这一要求称为数组的“矩形原则”。
  • 在内存中,数组的元素按序号存储。在存取数组中的数据时按存储顺序存取,可以充分利用计算机的缓存机制,减少在内存中的跳转,从而提高数据的存取效率。由于MATLAB遵循“列优先”原则,所以在访问数组时按列存取数据会更高效。
  • 在数组的使用过程中,size、length、numel、ndims、isempty等函数十分常用。请doc这些函数,熟悉它们的基本用法。

下一篇:轻松掌握MATLAB - 2.2 数组的基本操作

相关推荐

最全的MySQL总结,助你向阿里“开炮”(面试题+笔记+思维图)

前言作为一名编程人员,对MySQL一定不会陌生,尤其是互联网行业,对MySQL的使用是比较多的。对于求职者来说,MySQL又是面试中一定会问到的重点,很多人拥有大厂梦,却因为MySQL败下阵来。实际上...

Redis数据库从入门到精通(redis数据库设计)

目录一、常见的非关系型数据库NOSQL分类二、了解Redis三、Redis的单节点安装教程四、Redis的常用命令1、Help帮助命令2、SET命令3、过期命令4、查找键命令5、操作键命令6、GET命...

netcore 急速接入第三方登录,不看后悔

新年新气象,趁着新年的喜庆,肝了十来天,终于发了第一版,希望大家喜欢。如果有不喜欢看文字的童鞋,可以直接看下面的地址体验一下:https://oauthlogin.net/前言此次带来得这个小项目是...

精选 30 个 C++ 面试题(含解析)(c++面试题和答案汇总)

大家好,我是柠檬哥,专注编程知识分享。欢迎关注@程序员柠檬橙,编程路上不迷路,私信发送以下关键字获取编程资源:发送1024打包下载10个G编程资源学习资料发送001获取阿里大神LeetCode...

Oracle 12c系列(一)|多租户容器数据库

作者杨禹航出品沃趣技术Oracle12.1发布至今已有多年,但国内Oracle12C的用户并不多,随着12.2在去年的发布,选择安装Oracle12c的客户量明显增加,在接下来的几年中,Or...

flutter系列之:UI layout简介(flutter-ui-nice)

简介对于一个前端框架来说,除了各个组件之外,最重要的就是将这些组件进行连接的布局了。布局的英文名叫做layout,就是用来描述如何将组件进行摆放的一个约束。在flutter中,基本上所有的对象都是wi...

Flutter 分页功能表格控件(flutter 列表)

老孟导读:前2天有读者问到是否有带分页功能的表格控件,今天分页功能的表格控件详细解析来来。PaginatedDataTablePaginatedDataTable是一个带分页功能的DataTable,...

Flutter | 使用BottomNavigationBar快速构建底部导航

平时我们在使用app时经常会看到底部导航栏,而在flutter中它的实现也较为简单.需要用到的组件:BottomNavigationBar导航栏的主体BottomNavigationBarI...

Android中的数据库和本地存储在Flutter中是怎样实现的

如何使用SharedPreferences?在Android中,你可以使用SharedPreferencesAPI来存储少量的键值对。在Flutter中,使用Shared_Pref...

Flet,一个Flutter应用的实用Python库!

▼Flet:用Python轻松构建跨平台应用!在纷繁复杂的Python框架中,Flet宛如一缕清风,为开发者带来极致的跨平台应用开发体验。它用最简单的Python代码,帮你实现移动端、桌面端...

flutter系列之:做一个图像滤镜(flutter photo)

简介很多时候,我们需要一些特效功能,比如给图片做个滤镜什么的,如果是h5页面,那么我们可以很容易的通过css滤镜来实现这个功能。那么如果在flutter中,如果要实现这样的滤镜功能应该怎么处理呢?一起...

flutter软件开发笔记20-flutter web开发

flutterweb开发优势比较多,采用统一的语言,就能开发不同类型的软件,在web开发中,特别是后台式软件中,相比传统的html5开发,更高效,有点像c++编程的方式,把web设计出来了。一...

Flutter实战-请求封装(五)之设置抓包Proxy

用了两年的flutter,有了一些心得,不虚头巴脑,只求实战有用,以供学习或使用flutter的小伙伴参考,学习尚浅,如有不正确的地方还望各路大神指正,以免误人子弟,在此拜谢~(原创不易,转发请标注来...

为什么不在 Flutter 中使用全局变量来管理状态

我相信没有人用全局变量来管理Flutter应用程序的状态。毫无疑问,我们的Flutter应用程序需要状态管理包或Flutter的基本小部件(例如InheritedWidget或St...

Flutter 攻略(Dart基本数据类型,变量 整理 2)

代码运行从main方法开始voidmain(){print("hellodart");}变量与常量var声明变量未初始化变量为nullvarc;//未初始化print(c)...