龙空技术网

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

junziyang 75

前言:

当前同学们对“matlab访问数组元素”大概比较关心,看官们都想要剖析一些“matlab访问数组元素”的相关资讯。那么小编在网络上汇集了一些对于“matlab访问数组元素””的相关知识,希望各位老铁们能喜欢,兄弟们快快来学习一下吧!

上一篇:轻松掌握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。

图2.1 不同名称数组的关系 图2.1 数组的分类与关系

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

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

图2.2 数组的下标与序号

数组中的元素可以通过下标或序号来确定其位置。所谓下标,是指元素所在的行、列、页、....中的坐标。在每一页中,坐标原点位于左上角,从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 数组的基本操作

标签: #matlab访问数组元素