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

Matlab基础入门手册(第二章:矩阵)

bigegpt 2024-09-16 12:24 9 浏览

第二章 矩阵

1.6 创建矩阵

1.创建矩阵

2.认识创建方法

基本运算符 []

冒号运算符 :

用逗号或空格分隔同一行的元素

用分号或回车键分隔不同的行

创建序列 linspace

3.说明

矩阵是一个二维的数据阵列

Matlab 是一个基于矩阵的计算环境,最基本的的数据结构是矩阵

单个数值也存储为矩阵,在这种情况下,矩阵的大小为 1 乘 1

再例如'Hello World'这样的字符元素是 1×11 的矩阵

也支持有两个以上维度的数据结构,即 n 维数组

4.实例演示

%1_6
[1 2 3] %空格分隔元素
[1,2,3] %逗号分隔元素
[1 2 3
4 5 6] %回车创建不同行
[1 2 3;4 5 6] %分号分隔不同行
1:5 %行向量: 1 至 5
1:4.5 %取整到 4
4:1 %空的行向量(错误写法)
4:-1:1 %4 至 1 行向量(正确写法)
2.5:0.3:3.2 %按 0.3 增长至边界值内
linspace(1,5,5) %参数分别为起点、终点和元素个数
linspace(1,5) %不指定元素个数,则默认 100 个元素


1.7 创建矩阵的函数

1.介绍一些创建矩阵的常用函数

2.认识函数

全 0 矩阵 zeros

全 1 矩阵 ones

单位矩阵 eye

对角矩阵 diag

魔方矩阵 magic

随机矩阵 rand

上三角矩阵 triu

下三角矩阵 tril

3.实例演示

%1_7
zeros(1,4) %1 行 4 列全 0 矩阵
zeros(3,4) %3 行 4 列全 0 矩阵
zeros(4) %4 阶全 0 矩阵
ones(1,4) %1 行 4 列全 1 矩阵
eye(3) %3 阶单位矩阵
eye(2,3) %2 行 3 列单位矩阵
magic(3) %3 阶魔方矩阵
magic(30)
a=rand(1,4) %1 行 4 列随机矩阵
b=rand(4) %4 阶随机矩阵
diag(b) %提取对角线元素
diag(a) %a 为向量,则将 a 元素扩展为 n 阶矩阵
triu(b) %提取上三角形元素
tril(b) %提取下三角形元素
tril(b,1) %添加偏移量参数,1 正数往右上
tril(b,2)
tril(b,-1) %向左下偏移 1,再取下三角元素


1.8 连接矩阵

1.矩阵的连接

2.认识连接方法

基本连接符[]

水平连接 horzcat

垂直连接 vertcat

平铺复制 repmat

对角分块 blkdiag

任意维度连接 cat

3.说明

矩阵连接是通过连接一个或多个矩阵来创建一个新矩阵的过程

与创建类似,逗号或空格实现水平连接,分号实现垂直连接

连接后的矩阵要仍然保持矩形结构才能实现连接

也就是说,水平连接矩阵,每个矩阵必须具有相同的行数

垂直连接时,每个矩阵必须具有相同的列数

4.实例演示

%1_8
a=[1 2;3 4]
b=[5 6;7 8]
[a,b] %矩阵水平连接
[a;b] %垂直连接
horzcat(a,b) %水平连接函数
vertcat(a,b) %垂直连接函数
repmat(a,1,3) %平铺复制为 1 行 3 列矩阵
repmat(a,3,3)
blkdiag(a,b) %对角分块重组函数:将矩阵 a 和 b 整体分别视为对角线上元素进行重组
e=[1 2]
cat(1,e,e) %任意维度连接:维度、矩阵 e、矩阵 e。1 维按列纵向连接
cat(2,e,e) %2 维:横向连接
cat(3,e,e) %3 维:页面方向(三维方向)


1.9 矩阵索引

1.矩阵的索引

2.认识函数

获取矩阵的行列数 size

3.概念

一个矩阵里有多个元素,要想访问或修改其中的元素,使用索引

索引 3 种方式:

①组合索引 A(i,j),也称下标索引

②线性索引 A(i) ,按列优先的顺序依次向下索引

③逻辑索引,在逻辑为真的位置返回矩阵的元素

4.说明

组合索引和线性方式可以互换

访问多个元素或不连续的元素可以把索引写成矩阵的形式

逻辑索引的维度必须与矩阵的维度相同

索引超出矩阵范围的元素会报错

5.实例演示

%1_9
a=magic(3) %3 阶魔方矩阵
a(2,3) %组合索引:索引第 2 行第 3 列元素(2 个参数,用逗号分隔)
a(3) %线性索引:列优先索引(1 个参数)
size(a) %获取矩阵行列维度
sub2ind([3,3],2,3) %组合索引转化为线性索引,三个输入参数为:矩阵维度、组合索引行位置、组合索引列位置
[row,col]=ind2sub(size(a),8) %线性索引转化为组合索引
% a(3,4) %超出范围报错(初学者常犯错误)
a(1,:) %冒号:表示任意行或任意列
a(:,1) %任意行的第 1 列
a(:,:)
a(1,2:3) %第 1 行,第 2-3 列
a(1,[1 3]) %第 1 行,第 1 列和第 3 列
a(1,end) %end 表示最后一个:第 1 行最后 1 列
a([1 3]) %线性索引:矩阵 a 第 1 个和第 3 个元素
a([1 2;4 5]) %提取第 1、2 和第 4、5 个元素并分别放置在矩阵第 1 行和第 2 行
a(:) %按列优先转变为单个数字序列,返回一列值
b=[1 2;3 4]
c=[true false;true false] %逻辑数组结果用 1/0 表示
b(c) %逻辑索引:逻辑值为真返回对应元素,为假不返回


1.10 矩阵元素修改

1.矩阵元素的修改、添加和删除

2.说明

通过指定矩阵索引修改、添加或删除相应元素

索引超出矩阵范围的元素会报错,但可以赋值

删除元素后的矩阵仍然要保持矩形,否则报错

必要时,对超出矩阵范围的索引赋值需要预分配内存

3.实例演示

%1_10
a=[1 2 3;4 5 6;7 8 9]
a(2,2)=10
a(2)=10
a(3,4)=10 %超出矩阵范围索引会报错,但可以赋值。扩展为索引维度再对该索引元素赋值,其余扩充位置填充元素 0
a(3:4,4:5)=[1 2;3 4] %通过组合索引赋值,先扩展维度再赋值
a(:,2)=[] %任意行第 2 列变为空:删除
% a(1,2)=[] %矩阵单个元素删除报错,删除单个元素无法保持矩阵维度
a(2)=[] %线性索引先按列优先扩展为单个数字序列,删除单个元素可行


1.11 重塑矩阵

1.重塑矩阵包括矩阵的元素重排、旋转、翻转、移位、排序等

2.认识函数

元素重排 reshape

旋转 rot90

左右翻转 fliplr

上下翻转 flipud

翻转 flip

循环移位 circshift

排序 sort

按行排序 sortrows

判断是否排序 issorted

3.实例演示

%1_11
%作者:freexyn
a=[1 2 3 4;5 6 7 8]
reshape(a,4,2) %元素重排,参数:矩阵名称、重排行数、重排列数。重排规则:按列优先重排为所需维度
% reshape(a,3,3) %元素数量不符报错
rot90(a) %矩阵旋转:逆时针 90 度
fliplr(a) %矩阵左右翻转
flipud(a) %矩阵上下翻转
flip(a,1) %矩阵任意方向翻转:参数 1 为方向,1 维方向是上下翻转
flip(a,2) %2 维方向是左右翻转
circshift(a,[0 2]) %矩阵循环移位:矩阵、移动步长(用向量表示行数、列数),移动方向为坐标轴正方向
circshift(a,[-1 2])
sort(a) %矩阵元素的列排序:默认升序排列(行不保持)
sort(a,'descend') %参数:降序排列
issorted(a) %判断是否按升序已排列
issorted(a,'descend')
b=magic(3)
sortrows(b) %按行(保持)排序:将行视为整体,不指定参数则默认按每行第 1 元素大小升序排列
sortrows(b,2) %指定参数 2,即按每行第 2 个元素排序
sortrows(b,3)


1.12 矩阵属性

1.矩阵的属性

描述矩阵的信息,包括大小、长度、元素数目和维度等

2.认识函数

大小 size

长度 length

元素数目 numel

维度 ndims

3.实例演示

%1_12
a=[1 2 3 4;5 6 7 8]
size(a) %矩阵行数列数
length(a) %矩阵长度:取行数、列数中的最大值
length(a') %矩阵转至后,长度仍为 4
numel(a) %返回元素个数
ndims(a) %矩阵维度数:2 即行和列(2 维度)
ndims(a(1,:)) %组合索引提取出第 1 行索引再计算维度,即行向量的维度,结果 2 因仍为行和列(2 维度)
ndims(a(1,1)) %提出 1 行 1 列元素计算维度,结果仍为 2,因单元素认为 1*1 矩阵(2 维度)


1.13 特殊矩阵形式

1.特殊的矩阵形式:空矩阵、标量和向量

2.认识函数

判断空矩阵 isempty

判断标量 isscalar

判断向量 isvector

3.概念

3.1 空矩阵

有一个或多个等于零的维度(0×0,0×1,1×0)

3.2 标量

维度为 1×1 的矩阵,在 Matlab 中显示为单个实数或复数

3.3 向量

维度为 1×n 或 n×1 的矩阵,在 Matlab 中显示为一个行或一个列

4.实例演示

%1_13
%freexyn
a=[] %空矩阵
size(a) %获取行列数
length(a) %矩阵长度
numel(a) %元素个数
ndims(a) %矩阵维度
isempty(a) %判断是否空矩阵
zeros(0,1) %全 0 矩阵指定一个维度为 0
a=2 %创建标量
size(a)
length(a)
numel(a)
ndims(a)
isempty(a)
isscalar(a) %判断是否为标量
a=[1 2 3] %创建向量
size(a)
length(a)
numel(a)
ndims(a)
isempty(a)
isscalar(a)
isvector(a) %判断是否向量


1.14 多维数组

1.多维数组的创建和索引方法

2.认识函数

维度简化 squeeze

3.概念

Matlab 中具有多于两个维度的数据阵列被称为多维数组

多维数组是普通二维矩阵的扩展

如图为 3*3*2 的三维数组(维度名称分别为行、列、页面)

4.实例演示

%1_14
a=[1 2 3;4 5 6;7 8 9]
b=[11 12 13;14 15 16;17 18 19]
c=a
c(:,:,2)=b %数组 c 任意行任意列的第 2 个页面赋值数组 b。显示时,对高维数组进行拆分,拆分为 2 维数组显示
ndims(c) %数组维度
size(c) %行、列、页面数
d=c %3 维数组赋值给 d
d(:,:,:,2)=c %d 的任意行、列、页面的第 4 个维度的第 2 索引赋值一个 3 维数组 c。显示时,高维数组依次拆分,遍历循环显示每个 2 维数组
ndims(d) %4 维
size(d) %每个维度大小:3 3 2 2
%% 用创建矩阵的函数创建高维数组
zeros(2,2,2) %3 维全 0 数组
repmat(10,[2 2 2]) %矩阵平铺重塑:将标量 10 平铺重塑为 2 行 2 列 2 页面的数组
reshape(c,[2 3 3]) %对高维数组进行重塑:c 是 3*3*2 数组重塑为 2*3*3 数组
c(1,[1 2],2) %组合索引:访问数组 c 中第 1 行、第 1 和 2 列中、第 2 个页面的元素
d(:,:,1,1) %(4 维数组)组合索引:任意行、列、第 1 页面、第四维度 1 的元素
c(1,1) %对于 3 维数组使用低维索引,索引第 1 行第 1 列,不指定页面,也可索引。高维数组使用低维索引,会自动用 1 补齐末尾索引
a(1,1,1) %低维数组用高维索引。原理:Matlab 中任何数组都可理解为无限尾随 1 的高维数组
e=ones(2,2,1,1,1,1,1) %全 1 矩阵:2 行 2 列,后面尾随 1 无实际意义
e=ones(2,2,1,1,1,2,1) %全 1 矩阵:2 行 2 列,第 6 维为 2,会将 3、4、5、7 维度初始化为0
squeeze(e) %维度简化:简化高维数组中不必要的维度


1.15 性能优化

1.在处理大型数组时,兼顾 Matlab 运算性能的优化

2.说明

使用大型数组时,尽量避免创建不必要的副本

处理数组容量不断变化的问题时,合理的进行预分配内存

把代码放入程序文件中,比在命令窗口中,运算效率高

3.实例演示

%1_15
a=magic(3)
a(3,3)=10
b=a %数据一样,变量名称不同,因此 a、b 变量同时指向了同一矩阵
a(3,3)=15 %执行该命令,先预分配内存并复制一份 a 的原始值,保留在上个语句 b 中,然后再改变 a 的元素值
%预分配内存:输入变量时会初始化分配所需内存,而后续编程中变量变化需要更多内存时,需额外内存支持,可能面临分布式的内存分布,调用效率受到影响,因此需预分配内存
a=zeros(300,300) %初始化 300*300 全 0 矩阵,Matlab 会分配相应内存,在该维度内对元素进行相应修改替换,确保在完整内存中高效运行
% a=zeros(30000,30000)

(第二章结束,后接第三章)

相关推荐

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