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

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

bigegpt 2024-09-16 12:23 4 浏览

上一篇:轻松掌握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 数组的索引与变换

相关推荐

最全的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)...