玖叶教程网

前端编程开发入门

轻松掌握MATLAB - 2.2 数组的创建

上一篇:轻松掌握MATLAB - 2.1 数组的基本概念


数组是MATLAB的基本数据单元。熟练掌握数组创建、合并、增删、排序、变换、索引等基本操作是用好MATLAB的基础。

MATLAB中有多种方法来创建数组。下面举例说明最常用的几种方法。

1. 直接输入法

对于比较简单的矩阵,可以直接输入。例如,

方括号[]为数组构建符号,方括号中用逗号或空格分隔同行元素,用分号或回车换行。输入的数组要符合“矩形原则”,即各行的元素个数要相等,各列的元素个数也要相等,否则会报错。


【说明】

  • 在Live Editor中,输入代码时编辑器会对代码的语法进行实时检查,在有问题的代码处、窗口右侧的语法问题标记栏进行提示。语法错误用红色的横向表示,警告用黄色的横向表示。鼠标指向标志线,会提示有问题的代码位置、代码的问题和修复建议。点击标志线会直接定位到代码行。
  • 在Live Editor中,执行代码有几种方式:点击顶部工具栏上Run,执行整个文件;点击Run Section执行光标所在的当前段;点击代码行号,执行当前行;如果程序编辑后没有执行,最左侧会显示一个斜杠标志,点击这个区域也可以执行整个.mlx文件。

2. 冒号法

用冒号(Colon)可以生成元素间等间隔的向量(等差数列)。基本语法如下:

 x = star:step:stop

该方法可以生成从start开始,间隔为step的向量,向量中最后一个元素stop。注意:当(stop-start)/step不为整数时,stop不会出现在向量中。另外,step的默认值为1,当步长为1时可省略不写。

可以看到,由于步长无法将区间长度等分,导致最后一个元素小于π。为避免这种情况发生,我们可以按需要生成的数据个数来计算步长。例如,

这样操作后,仍然生成了7个等间隔的数,此时最后一个数就等于π了。需要注意的是,如果新生成的变量与已有变量同名,原来的同名变量的内容会被覆盖。我们先后两次对a进行了赋值,a第一次被赋的值会被第二次的赋值所覆盖。

3. 赋值法

通过下标索引赋值,可以分步创建数组。例如,

等号右边的B(1,:)是对数组B进行下标索引。注意这里冒号的新功能:在进行数组索引时,冒号指代的是它所在维度的所有下标,可以读作“所有行/列/页..."。例如,B(1,:),表示”B的第1行所有列“。由于在赋值前数组B尚不存在,因此在对B的第一行的所有列进行赋值的同时会创建该数组,数组列数由等号右侧的数组决定。我们用同样的方法再增加一行,

这次赋值时,由于B的列数已经确定,因此为第2行赋值时必须满足“矩形原则”,否则MATLAB会报错。

用赋值法可以创建多维数组。例如,

得到的MA是个三维数组,它的第一页被赋值为前面创建的数组A,第二页被赋值为数组B。

用标量赋值时,会用该标量填充赋值区域的每一个位置。例如,

可以看到,第4页的所有元素都被赋值为1。在对第4页进行赋值之前,MA已经有了前两页。跳过第3页直接对第4页进行赋值后,被跳过的第3页会自动以0填充。最后一行代码,回过头来再去对第3页进行赋值时,MATLAB报错了。从报错信息可以看出,这是因为这次赋值违背了数组的“矩形原则”。

思考一下:如何将MA的第3页的第一行赋值为1,第2行赋值为2?

由于对数值型数组赋值时被跳过的区域会以0填充,因此可以用赋值法来创建一个指定形状的全零数组。例如,

创建了一个2行3列的全零数组。

4. 函数法

MATLAB 为用户提供了多个函数来生成常见的数组,这些函数的功能和使用方法如表 2.1 所示。

用zeros函数生成指定形状的全0数组。例如,

上述代码生成了一个2×3的全0数组。zeros函数常用来在循环前为大型数组预分配内存,这与前面提到的“末位元素赋零法”效果相同,但程序的可读性更好。

利用函数法可以直接生成多维数组。但是,如果指定的最高维度的长度被指定为1,则该维度将被忽略。例如,

用ndims函数来查询B的维度,

可以看到,在使用rand函数创建数组B时,长度为1的最高维度被依次忽略了,最种生成了一个2行3列2页的三维随机数组。

用linspace函数可以生成线性坐标下等间隔的向量。基本语法如下:

 x = linspace(x1,x2,n)

在x1和x2之间,等间隔的生成n个数。这个区间的两个端点均包括在内。这相当于冒号法的指令:x1:(x2-x1)/(n-1):x2。最后的参数n是一个可选参数,其默认值为100。例如,

logspace函数的用法和linspace完全相同,区别在于它生成的是对数坐标下等间隔的向量。请自行尝试。


【练习】

  • doc表2.1中的函数,熟悉其基本语法和功能。

5. 拼接法

某些情况下,我们需要将已经存在的数组拼接成一个新的数组。在 MATLAB 中,我们可以使用cat函数来实现这个目标。cat函数的基本语法如下:

 C = cat(dim,A1,A2,…,An)

该函数将数组A1...An沿dim方向拼接成一个新数组C。需要说明的是,不是所有的数组都可以拼接到一起,只有“形状兼容”的数组才可以拼接。这里所说的“形状兼容”是指除了需要拼接的维度之外,所有参与拼接的数组在其他维度上的长度必须相等。例如,

上述指令将两个2×3的矩阵A和B沿着第3维进行拼接,形成了一个2×3×2的三维数组C。接下来,我们再将数组A拼接到数组C的后面。

由于C的形状是2x3x2,而A的形状可以看作是2x3x1,除了第3维之外,其他维度的长度都相等,所以A和B满足“形状兼容”的条件,可以进行拼接。如果将C和A沿着其他方向拼接则会报错,请可自行尝试,并分析报错原因。

由于沿横向和纵向拼接最为常用,因此MATLAB提供了两个专门的函数horizcat和vertcat用于实现横向和纵向拼接。例如,

对于数值计算中最常用到的矩阵(2维数组),可以用已有矩阵为元素,通过数组构建符号[ ]直接生成新矩阵。例如,

这与前面介绍过的直接输入法的区别仅在于,这里往方括号中输入的元素是矩阵,而非单个的数。在方括号中,同一行的元素仍然需用逗号或空格分隔,不同行则需用分号或回车分隔。在MATLAB中,要学会将数组视为一个整体来思考问题。利用这种方法也可以拼接字符型数组。例如,

无论哪种类型的数组,也不管使用哪种拼接方法,参与拼接的数组必须满足形状兼容,确保拼接结果符合“矩形原则”。否则,MATLAB就会报错。

6. 复置法

以数组为基础,按照某种规则重复放置,可以快速生成更大的数组。下面介绍几种常用的方法和相关函数。

当输入参数为向量时,diag函数会生成一个以向量中的元素为对角元素的对角矩阵。例如,

可以看出,对角线上的元素正是输入向量v中的元素。如果diag的输入参数为矩阵,则会返回对角线上的向量。例如,

返回的列向量的元素为输入矩阵a的对角线上的元素。

repmat函数可以将矩阵在给定的维度按指定的次数重复放置,创建新数组。基本语法如下:

B = repmat(A,r1,...,rN)

其中r1,...,rN为矩阵A在1到N维的重复次数。例如以矩阵a为基本单元,在纵向重复2次、横向重复3次并将结果赋值给b。

repelem函数的语法与repmat相同,该函数可以将输入数组中的每个元素在给定的维度重复指定的次数。例如,

可以看出,新生成的数组c中,a的每个元素在纵向上重复了2次、横向上重复了3次。

blkdiag函数以矩阵为基本单元,生成分块对角阵。例如,

与diag函数相似,blkdiag函数以输入矩阵为基本单元,将它们依次放置在对角线上。新生成的矩阵中,余位会以0填充。


以上是最常用的6种创建数组的方法。在编程实践中,生成某个数组的方法可能并不唯一,经常也会多种方法并用。只有熟练掌握这些方法,才能在实践中根据实际情况,快速、高效地生成所需的数组。



下一篇:轻松掌握MATLAB - 2.3 数组的索引与变换

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言