数据结构论坛

首页 » 分类 » 分类 » Matlab基础入门手册第二章矩阵
TUhjnbcbe - 2023/9/7 21:17:00

第二章矩阵

1.6创建矩阵

1.创建矩阵

2.认识创建方法

基本运算符[]

冒号运算符:

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

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

创建序列linspace

3.说明

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

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

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

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

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

4.实例演示

%1_6

[]%空格分隔元素

[1,2,3]%逗号分隔元素

[

]%回车创建不同行

[;]%分号分隔不同行

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)%不指定元素个数,则默认个元素

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=[12;34]

b=[56;78]

[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=[12]

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,[13])%第1行,第1列和第3列

a(1,end)%end表示最后一个:第1行最后1列

a([13])%线性索引:矩阵a第1个和第3个元素

a([12;45])%提取第1、2和第4、5个元素并分别放置在矩阵第1行和第2行

a(:)%按列优先转变为单个数字序列,返回一列值

b=[12;34]

c=[truefalse;truefalse]%逻辑数组结果用1/0表示

b(c)%逻辑索引:逻辑值为真返回对应元素,为假不返回

1.10矩阵元素修改

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

2.说明

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

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

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

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

3.实例演示

%1_10

a=[;;]

a(2,2)=10

a(2)=10

a(3,4)=10%超出矩阵范围索引会报错,但可以赋值。扩展为索引维度再对该索引元素赋值,其余扩充位置填充元素0

a(3:4,4:5)=[12;34]%通过组合索引赋值,先扩展维度再赋值

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=[4;]

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,[02])%矩阵循环移位:矩阵、移动步长(用向量表示行数、列数),移动方向为坐标轴正方向

circshift(a,[-12])

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=[4;]

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=[]%创建向量

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=[;;]

b=[;;]

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)%每个维度大小:

%%用创建矩阵的函数创建高维数组

zeros(2,2,2)%3维全0数组

repmat(10,[])%矩阵平铺重塑:将标量10平铺重塑为2行2列2页面的数组

reshape(c,[])%对高维数组进行重塑:c是3*3*2数组重塑为2*3*3数组

c(1,[12],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(,)%初始化*全0矩阵,Matlab会分配相应内存,在该维度内对元素进行相应修改替换,确保在完整内存中高效运行

%a=zeros(00,00)

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

1
查看完整版本: Matlab基础入门手册第二章矩阵