Matlab自学一本通之基本矩阵操作

Matlab自学一本通之基本矩阵操作

2021年7月9日

矩阵和数组的概念及其区别

​ 对矩阵的基本操作,主要有矩阵的构建、矩阵维度与矩阵大小的改变、矩阵的索引、矩 阵属性信息的获取、矩阵结构的改变等。对于这些操作,MATLAB 中都有固定指令或相应 的库函数与之相对应。

​ 矩阵最早来自于方程组的系数及常数所构成的方阵,这一概念由 19 世纪英国数学家凯 利首先提出。

​ 数组是在程序设计中,为了处理方便,把具有相同类型的若干变量按有序的形式组织起来的一种形式。这些按序排列的同类数据元素的集合称为数组

​ 在 MATLAB 中,一个数组可以分解为多个数组元素,这些数组元素可以是基本数据类型或构造类型。因此按数组元素的类型不同,数组又可分为数值数组、字符数组、单元数组、 结构数组等各种类别

​ 由此可见,矩阵和数组在 MATLAB 中存在很多方面的区别,主要有以下几个方面:

	矩阵是数学上的概念,而数组是计算机程序设计领域的概念。
	作为一种变换或者映射算符的体现,矩阵运算有着明确而严格的数学规则。而数组运算是 MATLAB 软件定义的规则,其目的是为了使数据管理方便,操作简单, 命令形式自然,执行计算有效。

​ 两者间的联系主要体现在:在 MATLAB 中,矩阵是以数组的形式存在的。因此,一维数组相当于向量,二维数组相当于矩阵,所以矩阵是数组的子集


矩阵的构造

​ 矩阵的构建方式有两种,一种与单元数组相似,可以对变量直接进行赋值另一种是 MATLAB 中提供构建特殊矩阵的指令,如下表所示。

函数名称函数功能
ones(n)构建一个n×n的1矩阵(矩阵的元素全部都是1)
ones(m,n,…,p)构建一个m×n×…×p的1矩阵
ones(size(A))构建一个和矩阵A同样大小的1矩阵
zeros(n)构建一个n×n的0矩阵(输出矩阵的元素全部都是0)
zeros(m,n,…,p)构建一个m×n×…×p的0矩阵
zeros(size(A))构建一个和矩阵A同样大小的0矩阵
eye(n)构建一个n×n的单位矩阵
eye(m,n)构建一个m×n的单位矩阵
eye(size(A))构建一个和矩阵A同样大小的单位矩阵
magic(n)构建一个n×n的矩阵,其每一行、每一列的元素之和都相等
rand(n)构建一个n×n的矩阵,其元素为0~1之间均匀分布的随机数
rand(m,n,…,p)构建一个m×n×…×p的矩阵,其元素为0~1之间均匀分布的随机数
randn(n)构建一个n×n的矩阵,其元素为零均值、单位方差的正态分布随机数
randnm,n,…,p)构建一个m×n×…×p的矩阵,其元素为零均值、单位方差的正态分布随机数
diag(x)构建一个n为的仿真,他的主对角线元素值取自向量x,其他元素的值都是0
diag(A,k)构建一个有矩阵A第k条对角线的元素组成的列向量。
k=0为主对角线;k<0为下第k条对角线;k>0为上第k条对角线
diag(x,k)构建一个(n+|k|)×(n+|k|)维的矩阵,该矩阵的第k条对角线元素取自向量x,其余元素都是0(关于参数k,参考上个命令)
triu(A)构建一个和A大小相同的上三角矩阵,该矩阵的主对角线上元素为A中相应元素,其余元素都是0
triu(A,k)构建一个和A大小相同的上三角矩阵,该矩阵的第k条对角线及其以上元素为A中相应元素,其余元素都是0
tril(A)构建一个和A大小相同的下三角矩阵,该矩阵的主对角线上元素为A中相应元素,其余元素都为0
tril(A,k)构建一个和 A 大小相同的下三角矩阵,该矩阵的第 k 条对角线上及其以下元素为A中相应元 素,其余元素都为 0

建立简单矩阵

简单矩阵采用矩阵构造符号—方括号"[]",将矩阵元素置于方括号内,同行元素之间用空格或逗号隔开,行与行之间用分号";"隔开,格式如下:

matrixName = [element11,element12,element13;element21,element22,element23] 
matrixName = [element11 element12 element13;element21 element22 element23] 
% 简单矩阵构造示例。分别构造一个二维矩阵、一个行向量、一个列向量。
% 在命令行窗口依次输入下列命令:
A = [2,3,5;3,6,10] % 使用逗号和分号构造二维矩阵
B = [2 3 5;3 6 10] % 使用空格和分号构造二维矩阵
V1 = [8,59,60,33] % 构造行向量
V2 = [5;8;3;4;9] % 构造列向量
% 程序运行过程中的输出如下:
A = 2 3 5 
 	3 6 10 
B = 2 3 5 
 	3 6 10 
V1 = 8 59 60 33 
V2 = 5 
	 8 
	 3 
	 4 
	 9

建立特殊矩阵

特殊矩阵是指非零元素或零元素的分布有一定规律的矩阵,常见的有对称矩阵、三角矩阵和对角矩阵等。

% 特殊矩阵构造示例。
% 在命令行窗口中输入:
OnesMatrix = ones( 2 ), ZerosMatrix = zeros( 2 ), Identity = eye( 2 ), 
 Identity23 = eye( 2, 3 ), Identity32 = eye( 3, 2 ) 
% 输出结果:
OnesMatrix = 
 1 1 
 1 1 
ZerosMatrix = 
 0 0 
 0 0 
Identity = 
 1 0 
 0 1 
Identity23 = 
 1 0 0 
 0 1 0 
Identity32 = 
 1 0 
 0 1 
 0 0 

% 在命令行窗口中输入:
Random = rand( 2, 3 ), Array = Random( :, 2 ), Diagelement = diag( Random ), 
 Diagmatrix = diag( diag( Random ) ), Dmatrix_array = diag( Array ), 
 UpperTriangular = triu( Random ), LowerTriangular = tril( Random ) 
% 输出结果:
Random = 
 0.2785 0.9575 0.1576 
 0.5469 0.9649 0.9706 
Array = 
 0.9575 
 0.9649 
Diagelement = 
 0.2785 
 0.9649 
Diagmatrix = 
 0.2785  0 
 0		 0.9649 
Dmatrix_array = 
 0.9575  0 
 0		 0.9649 
UpperTriangular = 
 0.2785 0.9575  0.1576 
 0 		0.9649  0.9706 
LowerTriangular = 
 0.2785 0 		0 
 0.5469 0.9649  0 

向量、标量和空矩阵

​ 通常情况下,矩阵包括m行和n列,即m×n。当m和n取一些特殊值时,得到的矩阵具有一些特殊的性质。

(1)向量

当m=1或n=1,即1×n或m×1,建立的矩阵成为向量。例如输入:

a = [1 2 3 4 5 6]
b = [1;2;3;4;5;6]
whis     %调用whos函数查看变量a、b的相关信息
% 得到的结果
a = 1 2 3 4 5 6 
b = 
 1 
 2 
 3 
 4 
 5 
 6 
Name Size Bytes Class Attributes 
 a	 1x6   48	 double 
 b   6x1   48 	 double 

(2)标量

当 m=n=1 时,建立的矩阵称为标量。任意以 1×1 的矩阵形式表示的单个实数、复数都是标量。

在 MATLAB 中,标量有两种表示方法。

x = 10+2i % 将复数 10+2i 赋值给变量 x 
shape = size(x) % 查询变量 x 的形状信息
y = [10+2i] % 将复数 10+2i 构成的矩阵赋值给变量 y 
shape = size(y) % 查询变量 y 的形状信息
x==y % 判断变量 x 和 y 是否相等,“1”表示相等,“0”表示不相等
% 结果为:
x = 10.000000000000000 + 2.000000000000000i 
shape = 1 1 
y = 10.000000000000000 + 2.000000000000000i 
shape = 1 1 
ans = 1

​ 通过上述示例我们可以知道:单个实数或者复数在 MATLAB 中都是以矩阵的形式存储 的;在 MATLAB 中,单个数据或由单个数据构造的矩阵都是标量。

(3)空矩阵

当 m=n=0,或者 m=0,或者 n=0,即 0×0、0×n、m×0 时,创建的矩阵称为空矩阵。 空矩阵可以通过赋值语句建立。例如输入:

x = [] % 建立一个空矩阵
whos x % 调用 whos 函数查看变量 x 的相关信息
% 得到的结果
x = [] 
 Name   Size 	Bytes 		Class Attributes 
 x 		0x0 	0 				double
而再建立一个 0 矩阵,可以输入:
z = [0 0 0;0 0 0] % 建立一个 2 行 3 列的 0 矩阵
whos z % 调用 whos 函数查看变量 z 的相关信息
% 得到结果:
z = 
 0 0 0 
 0 0 0 
 Name Size 	Bytes 		Class Attributes 
 z 	 2x3 	48 			double 

空矩阵和 0 矩阵的本质区别在于:空矩阵内没有任何元素,因此不占用任何存储空间; 而0矩阵表示该矩阵中的所有元素全部为 0,需要占用一定的存储空间


矩阵大小及结构的改变

根据运算时的不同情况和需要,矩阵大小和结构的改变,主要的方式有旋转矩阵、改变 矩阵维度、删除矩阵元素等。MATLAB 中提供的具体此类函数如表所示。

函数名称函数功能
fliplr(A)矩阵每一行均进行逆序排列
flipud(A)矩阵每一列均进行逆序排列
flipdim(A, dim)生成一个在 dim 维矩阵 A 内的元素交换位置的多维矩阵
rot90(A)生成一个由矩阵 A 逆时针旋转 90°而得到的新矩阵
rot90(A, k)生成一个由矩阵 A 逆时针旋转 k×90°而得到的新矩阵
reshape(A,m,n)生成一个 m×n×…×p 维的矩阵,其元素以线性索引的顺序从矩阵 A 中取得
如果矩阵 A 中没有 m×n×…×p 个元素,将返回一个错误信息
repmat(A,[m n … p])创建一个和矩阵 A 有相同元素的 m×n×…×p 块的多维矩阵
shiftdim(A , n)矩阵的列移动 n 步。n 为正数,矩阵向左移;n 为负数,矩阵向右移
squeeze(A)返回没有空维的矩阵 A
cat( dim,A, B)将矩阵 A 和 B 组合成一个 dim 维的多维矩阵
permute(A, order)根据向量 order 来改变矩阵 A 中的维数顺序
ipermute(A, order)进行命令 permute 的逆变换
sort(A)对一维或二维矩阵进行升序排序,并返回排序后的矩阵;
当 A 为二维矩阵时,对矩阵的每一列分别进行排序
sort(A, dim)对矩阵按指定的方向进行升序排序,并返回排序后的矩阵。当 dim=1 时,对矩阵的每一列排序; dim=2 时,对矩阵的每一行排序
sort(A, dim, mode)mode 为’ascend’时,进行升序排序;mode 为’descend’时,进行降序排序
[B, IX] = sort(A,…)IX 为排序后备元素在原矩阵中的行位置或列位置的索引

矩阵的旋转与维度的改变。 在命令行窗口中输入:

Randoma = randn( 1,4 ), Randomb = randn( 2 ), Randoma = reshape( Randoma, 2, 
 2 ), Randoma = fliplr( Randoma ), Randoma = rot90( Randoma ), 
 Randomc = cat( 2, Randoma, Randomb ), 
 % 输出结果
 Randoma = %生成随机 1×4 矩阵
 0.6715 -1.2075 0.7172 1.6302 
Randomb = %生成随机 2×2 矩阵
 0.4889 0.7269 
 1.0347 -0.3034 
Randoma = %将 1×4 矩阵变维为 2×2 矩阵
 0.6715 0.7172 
 -1.2075 1.6302 
Randoma = %将 2×2 矩阵每行逆序排列
 0.7172 0.6715 
 1.6302 -1.2075 
Randoma = %将 2×2 矩阵逆时针旋转 90°
 0.6715 -1.2075 
 0.7172 1.6302 
Randomc = %将两个 2×2 矩阵组合为一个 2×4 矩阵
 0.6715 -1.2075 0.4889 0.7269 
 0.7172 1.6302 1.0347 -0.3034 

矩阵下标引用

​ 在 MATLAB 中,普通二维数组元素的数字索引分为双下标索引单下标索引

	双下标索引是通过一个二元数组对来对应元素在矩阵中的行列位置,例如 A(2,3)表示矩阵 A 中第 2 行第 3 列的元素。
	单下标索引的方式是采用列元素优先的原则,对 m 行 n 列的矩阵按列排序进行重组,成为一维数组,再取新的一维数组中的元素位置对应的值作为元素在原矩阵中的单下标,例如对于 4×4 的矩阵,A(7)表示矩阵 A 中第 3 行第 2 列的元素,而 A(13)表示矩 阵 A 中第 1 行第 4 列的元素。

比如,一个矩阵4×4的矩阵,其顺序为:

1	5	9	13
2	6	10	14
3	7	11	15
4	8	12	16

A(7)表示矩阵 A 中第 3 行第 2 列的元素,而 A(13)表示矩 阵 A 中第 1 行第 4 列的元素。

1.矩阵下标访问单个矩阵元素

常用的矩阵索引表达式如表所示。

索引表达式函数功能
A (1)将二维矩阵 A 重组为一维数组,返回数组中第一个元素
A (: , j)返回二维矩阵 A 中第 j 列列向量
A( i , : )返回二维矩阵 A 中第 i 行行向量
A (: , j : k)返回由二维矩阵 A 中的第 j 列到第 k 列列向量组成的子矩阵
A (i : k , : )返回由二维矩阵 A 中的第 i 行到第 k 行行向量组成的子矩阵
A ( i : k , j : l)返回由二维矩阵 A 中的第 i 行到第 k 行行向量
和第 j 列到第 l 列列向量的交集组成的子矩阵
A ( : )将矩阵 A 中的每列合并成一个长的列向量
A( j : k )返回一个行向量,其元素为 A ( : )中的第 j 个元素到第 k 个元素
A([ j1 j2 …] )返回一个行向量,其元素为 A ( : )中的第 j1、j2元素
A(:,[ j1 j2…] )返回矩阵 A 的第 j1列、第 j2列等的列向量
A([ i1 i2 …] , : )返回矩阵 A 的第 i1行、第 i2行等的行向量
A([ i1 i2…] , [ j1 j2 …] )返回矩阵第 i1行、第 i2行等和第 j1列、第 j2列等的元素

% 矩阵下标的引用示例。
Matrix = magic( 6 ) , Submatrix = Matrix( 2:3, 3:6 ), Array = 
 Matrix( [7:10 26:31] ) 
% 输出结果:
Matrix = 
 35 1 6 26 19 24 
 3 32 7 21 23 25 
 31 9 2 22 27 20 
 8 28 33 17 10 15 
 30 5 34 12 14 16 
 4 36 29 13 18 11 
Submatrix = 
 7 21 23 25 
 2 22 27 20 
Array = 
 1 32 9 28 23 27 10 14 18 24 

2.线性引用矩阵元素

矩阵中某一元素的单下标索引值和双下标索引值之间,可以通过 MATLAB 内部函数进 行转换,其句法形式为:

IND = sub2ind(siz, i, j)

​ 其功能为将双下标索引值转换为单下标索引值,其中 siz 是一个包含两个元素的数组, 代表了转换矩阵的行列数,一般可以直接用 size(A)表示,i 与 j 分别是双下表索引中的行、 列值,IND 是转换后的单下标索引值。

[I J] = ind2sub(siz, ind) 

其功能为将单下标索引值转换为双下标索引值,各变量意义同上。


% 矩阵元素单双下标索引值转换示例。
% 在命令行窗口中输入:
Matrix = magic( 3 ); IND = sub2ind( size( Matrix ), 2,3), 
[I J]= ind2sub( size( Matrix ), 7)
% 输出结果:
IND = 8 
I = 1 
J = 3 

3.访问多个矩阵元素

设 A=magic(4),如果需要计算第 4 列元素的和,按照前面介绍的方法可以用以下表达式 来实现:

A (1,4) + A (2,4) + A (3,4) + A (4,4)

在下标表达式里,可以用冒号来表示矩阵的多个元素。例如,A (1:k,j)表示矩阵第 j 列的 前 k 个元素。利用冒号,第 4 列元素的和可以用更为简洁的式子,代码设置如下:

sum(A(1:4, 4))

还有更简洁的方法,因为冒号本身可以表示一列或者一行的所有元素,所以上式还可以 写为:

sum(A(:,4))

在 MATLAB 中提供了一个关键字 end,用于表示该维中的最后一个元素,所以上式还可 以改写成:

sum(A(:,end))

实际上还可以用冒号来表示非相邻的多个元素,例如下面的代码:

A=1:10 
B=A(1:3:10) 
% 由上述语句得到如下输出结果:
A=1 2 3 4 5 6 7 8 9 10 
B=1 4 7 10 

矩阵信息的获取

矩阵的信息主要包括矩阵结构、矩阵大小、矩阵维度、矩阵的数据类型及内存占用等。

1.矩阵结构

矩阵的结构是指矩阵子元素的排列方式。MATLAB 提供了各种测试函数,如表所示。

函数名称函数功能
isempty( A )检测矩阵是否为空
isscalar( A )检测矩阵是否是单元素的标量矩阵
isvector( A )检测矩阵是否是只具有一行或一列元素的一维向量
issparse( A )检测数组是否是稀疏矩阵

这类函数的返回值是逻辑类型的数据。返回值为“1”表示该矩阵是某一特定类型的矩 阵;返回值为“0”表示该矩阵不是该特定类型的矩阵。

矩阵数据结构判断函数的使用方法示例。利用 zeros 函数生成一个 4×4、元素 全为 0 的矩阵 A,并判断矩阵 A 的数据结构。首先输入:

A = zeros(4,4) 
% 得到:
A = 
 0 0 0 0 
 0 0 0 0 
 0 0 0 0 
 0 0 0 0 

再利用表 中的各函数判断矩阵 A 的数据结构,依次输入的代码和结果分别如下:

isempty(A) % 判断矩阵 A 是否为空矩阵
ans = 0 
isscalar(A) % 判断矩阵 A 是否为标量
ans = 0 
isvector(A) % 判断矩阵 A 是否为向量
ans = 0 
issparse(A) % 判断矩阵 A 是否为稀疏矩阵
ans = 0 

2.矩阵大小

矩阵的形状信息反映了矩阵的大小,通常又包括以下几个方面的内容:

矩阵的维数。
矩阵各维(例如最长维、用户指定的维)的长度。
矩阵元素的个数。

​ 针对上述 3 个方面的信息,相应地,MATLAB 提供了 4 个函数,分别用于获取矩阵形状的相关信息,如表 所示。

函 数调用格式描 述
ndimsn=ndims(X)获取矩阵的维数
size[m,n]=size(X)获取矩阵在各维上的长度
lengthn=length(X)获取矩阵最长维的长度
numeln=numel(X)获取矩阵元素的个数

矩阵形状信息查询函数的使用示例。下面程序利用 eye 函数建立一个 5×3 的 矩阵,利用 ndims 函数获得矩阵 A 的维数信息,输入的程序和得到的输出结果依次如下:

A = eye(5,3) 
A = 
 1 0 0 
 0 1 0 
 0 0 1 
 0 0 0 
 0 0 0 

下面利用 ndims 函数获得矩阵 A 的维数信息。

ndims(A) 
ans = 2 

利用 length 函数获取矩阵 A 最长维的长度。

length(A) 
ans = 5

利用 size 函数获取矩阵 A 各维的长度。

[m,n] = size(A) 
m = 5 
n = 3 
d = size(A) 
d = 5 3 
e1 = size(A,1) 
e1 = 5 
e2 = size(A,2) 
e2 = 3 

​ 由上述 size 函数的应用可知:①size 函数的返回值可以是分开显示的单个实数变量,也 可以是一个行向量;②在 size 函数的输入参数中增加维度参数可以获取指定维度的长度,其中“1”表示行,“2”表示列。


使用 numel 函数(numel 是 number of elements 的简写可以获取矩阵 A 中元素的个数。 例如,输入:

f = numel(A) 
% 得到的结果如下:
f = 15

% 数值与矩阵的算术运算示例。
% 在命令行窗口中输入:
A = []; B = 1:4; C = [1:4; 5:8]; 
S1= size(A), S2= size(B), S3= length(B), S4= size(C), S5= length(C), S6= numel(C) 
% 输出结果:
S1 = 0 0 
S2 = 1 4 
S3 = 4 
S4 = 2 4 
S5 = 4 
S6 = 8 

3.矩阵维度

对于空矩阵、标量矩阵、一维矩阵和二维矩阵,MATLAB 都将其作为普通二维数组对 待。特别需要注意的是,用[]产生的空矩阵是作为二维矩阵的,但是在高维矩阵中也有空矩 阵的概念,此时空矩阵则具有多个维度。

MATLAB 中提供了 ndims 函数计算矩阵维度。

% 矩阵维度示例。
A = []; B = 5; C = 1:3; D = magic(2); E(:,:,2) = [1 2; 3 4]; 
Ndims = [ndims(A) ndims(B) ndims(C) ndims(D) ndims(E)] 
% 输出结果:
Ndims = 2 2 2 2 3

4.矩阵的数据类型

矩阵作为 MATLAB 的内部数据存储和运算结构,其元素可以是各种各样的数据类型,对应不同数据类型的元素,可以是数值、字符串、元胞、结构体等。MATLAB 中提供了一系列关于数据类型的测试函数,如表所示。

函数名称函数功能
isnumeric检测矩阵元素是否为数值型变量
isreal检测矩阵元素是否为实数数值型变量
isfloat检测矩阵元素是否为浮点数值型变量
isinteger检测矩阵元素是否为整数型变量
islogical检测矩阵元素是否为逻辑型变量
ischar检测矩阵元素是否为字符型变量
isstruct检测矩阵元素是否为结构体型变量
iscell检测矩阵元素是否为元胞型变量
iscellstr检测矩阵元素是否为结构体的元胞型变量

这类函数的返回值也是逻辑类型的数据。返回值为“1”表示是某一特定的数据类型; 返回值为“0”表示不是该特定的数据类型。

% 矩阵元素的数据类型的判断示例。
A = [2 3;10 7] 
isnumeric(A) 
isfloat(A) 
islogical(A) 
% 得到的结果为:
A = 2 3 
 10 7 
ans = 1 
ans = 1 
ans = 0 

建立一个字符串矩阵 B 并进行判断,程序如下所示:

% 矩阵元素的数据类型的判断示例。
B = ['MATLAB';'course'] 
isstruct(B) 
ischar(B) 
% 得到的结果为:
B = MATLAB 
course 
ans = 0 
ans = 1 
% 矩阵的数据类型示例。
Mat = magic(2); 
TrueorFalse = [isnumeric(Mat) isinteger(Mat) isreal(Mat) isfloat(Mat)] 
% 输出结果:
TrueorFalse = 
 1 0 1 1 

将矩阵 A 中的实数和复数分开为一个具有实数和复数的矩阵示例。 在命令行窗口中输入:

clear all 
%定义一个具有实数和复数的矩阵
A=[2 6.5 3i 3.5 6 4+2i]; 
%定义存储实数和复数的矩阵目前为空矩阵
real_array=[]; 
complex_array=[]; 
for i=1:length(A), 
 %判断矩阵元素是否为实数
	if isreal(A(i))==1, 
		real_array=[real_array A(i)]; 
	else 
		complex_array=[complex_array A(i)]; 
	end; 
end; 
%输出实数元素
real_array 
%输出复数元素
complex_array 
% 输出结果:
real_array = 
 2.0000 6.5000 3.5000 6.0000 
complex_array = 
 0 + 3.0000i 4.0000 + 2.0000i

5.矩阵占用的内存

​ 了解矩阵的内存占用情况,对于优化 MATLAB 代码性能是十分重要的。使用者可以通 过 whos 命令查看当前工作区中指定变量的所有信息,包括变量名、矩阵大小、内存占用和 数据类型等。

% 查看矩阵占用的内存示例。
Matrix = rand(2) 
% 输出结果:
Matrix = 
 0.2551 0.6991 
 0.5060 0.8909 
% 在命令行窗口中输入:
whos Matrix 
% 输出结果:
 Name Size Bytes Class Attributes 
 Matrix 2x2 32 double 

2.2.6 矩阵的保存和加载

1.矩阵在 MATLAB 中的存储方法

A = [1 0 -1;2 4 9;-5 3 0] 
命令行窗口输出如下信息:
A = 
  1 0 -1 
  2 4 9 
 -5 3 0

​ 事实上,MATLAB 并不是按照其命令行输出的格式将矩阵 A 存储在内存空间中的。我 们可以把内存空间想象成一列网格

在这里插入图片描述


2.矩阵元素的寻址

(1)矩阵下标寻址方法。

在 MATLAB 中,使用 A(i,j)来表示一个矩阵 A 从左上角数起的第 i 行、第 j 列上的元素, 这就是矩阵下标寻址方法。这种方法和线性代数中矩阵元素的引用方法一致,通俗易懂。以下分别介绍利用矩阵下标寻址方法访问矩阵中的单个元素和元素区域。

1)单元素的寻访。

当使用双下标访问一个二维矩阵中的某个元素时,必须同时指定该元素所在的行号和列 号,访问格式为

A(numRow,numColumn) 

其中,numRow 和 numColumn 分别代表行号和列号。

单个矩阵元素的访问示例。利用 rand 函数创建一个 4×3 的 0~1 均匀分布的 随机数矩阵 A 并访问其中的元素。

A = rand(4,3) 
x = A(2,2) 
y = A(4,3)
% 得到的结果为:
A = 
 0.957166948242946 0.421761282626275 0.655740699156587 
 0.485375648722841 0.915735525189067 0.035711678574190 
 0.800280468888800 0.792207329559554 0.849129305868777 
 0.141886338627215 0.959492426392903 0.933993247757551 
x = 0.915735525189067 
y = 0.933993247757551 

2)矩阵元素区域的寻访。

​ 访问矩阵的多个元素,可以是某一行、某一列或者其中的部分元素,也可以是矩阵中 的某一块区域。在MATLAB中,元素区域的访问需要用到冒号“:”来表示矩阵中的多个元 素,具体的访问格式如下:

A(1:m,n):表示访问第 n 列的第一个元素至第 m 个元素。
A(m,:) :表示访问第 m 行的所有元素。
A(i:j,m:n) :表示访问从第 i 行至第 j 行、从第 m 列至第 n 列的矩阵区域。
A(i:inc1:j,m:inc2:n) :表示访问从第 i 行至第 j 行,行间隔为 inc1 行;从第 m 列至第 n 列,列间隔为 inc2 的非相邻的多个矩阵元素。

矩阵元素区域的访问。利用 randn 函数创建一个 10×8 的 0~1 正态分布随机 矩阵 X,并进行访问。

X = randn(10,8) 
A = X(2,:) 
B = X(3:8,2:6) 
% 得到的结果为:
X = 
 0.2939 1.3703 1.0933 -0.2256 -1.0616 -0.1774 0.2157 -0.4390 
 -0.7873 -1.7115 1.1093 1.1174 2.3505 -0.1961 -1.1658 -1.7947 
 0.8884 -0.1022 -0.8637 -1.0891 -0.6156 1.4193 -1.1480 0.8404 
 -1.1471 -0.2414 0.0774 0.0326 0.7481 0.2916 0.1049 -0.8880 
 -1.0689 0.3192 -1.2141 0.5525 -0.1924 0.1978 0.7223 0.1001
 -0.8095 0.3129 -1.1135 1.1006 0.8886 1.5877 2.5855 -0.5445 
 -2.9443 -0.8649 -0.0068 1.5442 -0.7648 -0.8045 -0.6669 0.3035 
 1.4384 -0.0301 1.5326 0.0859 -1.4023 0.6966 0.1873 -0.6003 
 0.3252 -0.1649 -0.7697 -1.4916 -1.4224 0.8351 -0.0825 0.4900 
 -0.7549 0.6277 0.3714 -0.7423 0.4882 -0.2437 -1.9330 0.7394 
A = -0.7873 -1.7115 1.1093 1.1174 2.3505 -0.1961 -1.1658 -1.7947 
B = 
 -0.1022 -0.8637 -1.0891 -0.6156 1.4193 
 -0.2414 0.0774 0.0326 0.7481 0.2916 
 0.3192 -1.2141 0.5525 -0.1924 0.1978 
 0.3129 -1.1135 1.1006 0.8886 1.5877 
 -0.8649 -0.0068 1.5442 -0.7648 -0.8045 
 -0.0301 1.5326 0.0859 -1.4023 0.6966

(2)线性寻址。

线性寻址的原理来自于 MATLAB 将矩阵元素存储在内存空间的存储方法。与矩阵下标 寻址相比,只需要单一下标即可实现矩阵中任意位置元素的寻访。线性寻址的下标是通过矩阵的双下标换算得到的。

一般,设 A 是一个 m×n 的矩阵,位于第 i 行、第 j 列上的元素 A(i,j)的单一下标为
													A((j-1)·m+i)。

线性寻址示例。建立 3 阶希尔伯特矩阵 A,并进行线性寻址访问,程序如下:

A = hilb(3) 
A(2,3) % 采用矩阵下标寻址的方法访问第 2 行第 3 列的元素
A(8) 
% 得到的结果如下:
A = 
 1.0000 0.5000 0.3333 
 0.5000 0.3333 0.2500 
 0.3333 0.2500 0.2000 
ans = 0.2500 
ans = 0.2500 

(3)矩阵元素的赋值。

MATLAB 使用赋值语句对矩阵元素进行赋值,基本语法如下:

A(i,j) = value:等号左侧为矩阵中的某个元素;等号右侧为值。
A = []:删除矩阵中的所有元素。

矩阵元素的赋值示例。利用 magic 函数建立一个 4 阶的魔幻矩阵 M,并进行复制操作。

M = magic(4) 
M(2,1)=-2 
M(3:4,3:4)=0 
M = [] 
whos M % 调用 whos 函数查看矩阵 M 的详细信息
% 得到的结果为:
M = 
 16 2 3 13 
 5 11 10 8 
 9 7 6 12 
 4 14 15 1 
M = 
 16 2 3 13 
 -2 11 10 8 
 9 7 6 12 
 4 14 15 1 
M = 
 16 2 3 13 
 -2 11 10 8 
 9 7 0 0 
 4 14 0 0 
M = [] 
 Name Size Bytes Class Attributes 
 M 0x0 0 double 

(4)矩阵元素的扩展与删除。

增加或删除矩阵元素最常用的办法是使用赋值语句。

对于矩阵A = [1 1;2 2] ,如果现在要增加一行,则应在命令行窗口内输入:

A = [1 1;2 2] 
A(3,:) = 3 % 整行赋值
A(4,1) = 4;A(4,2) = 5 % 单个矩阵元素赋值的办法增加新元素
A(2,:) = [] % 使用空矩阵[]删除矩阵中的整行或整列
% 得到的结果为:
A = 
 1 1 
 2 2 
A = 
 1 1 
 2 2 
 3 3 
A = 
 1 1 
 2 2 
 3 3 
 4 5 
A = 
 1 1 
 3 3 
 4 5 

此外,MATLAB 提供了多个函数进行矩阵合并操作,从而实现将多个矩阵合并成一个矩阵。这些函数如表所示。

函数基本调用格式描述
catcat(DIM,A,B)在 DIM 指定的维度上合并矩阵 A 和 B。DIM=1 表示按行(竖直方向)合并;DIM=2 表示按列(水平方向)合并
horzcathorzcat(A,B)在水平方向上合并矩阵 A 和 B
vertcatvertcat(A,B)在竖直方向上合并矩阵 A 和 B
repmatB = repmat(A,M,N)通过复制 M×N 个矩阵 A 来构造新的矩阵B
blkdiagY = blkdiag(A,B,…)用已知的 A、B 等多个矩阵构造块对角化矩阵 Y,其中Y = [A 0 … 0;0 B … 0;0 0 … N]

矩阵合并函数示例。

A = [2 0 -1;1 3 2]; 
B = [1 7 -1;4 2 3;2 0 1]; 
C = [1 0 1 0;-1 2 0 1]; 

得到矩阵 A、B、C。然后使用 cat 函数对矩阵 A、B 进行合并操作。

MAB1 = cat(1,A,B) % 将矩阵 A、B 按行合并
% 得到结果:
MAB1 = 
 2 0 -1 
 1 3 2 
 1 7 -1 
 4 2 3 
 2 0 1 

如果合并错误,如:

MAB2 = cat(2,A,B) % 将矩阵 A、B 按列合并
MAC1 = cat(1,A,C) % 将矩阵 A、C 按行合并
% 得到结果:
Error using cat 
CAT arguments dimensions are not consistent. 

使用 cat 函数对矩阵 A、C 进行合并操作,输入如下:

MAC2 = cat(2,A,C) % 将矩阵 A、C 按列合并
% 得到结果:
MAC2 = 
 2 0 -1 1 0 1 0 
 1 3 2 -1 2 0 1

cat 及其相关的函数在将两个矩阵按某个维度进行合并操作时,原始的两个矩阵 要在某一个维度上具有相同的长度,否则 MATLAB 在进行计算时就会发生错误。


(2)使用 blkdiag 函数构造块对角化矩阵。例如输入:

A = [1 1;2 2];B=[3 3;4 4];C=[5 5;6 6]; 
Y = blkdiag(A,B,C) 
% 得到结果:
Y = 
 1 1 0 0 0 0 
 2 2 0 0 0 0 
 0 0 3 3 0 0 
 0 0 4 4 0 0 
 0 0 0 0 5 5 
 0 0 0 0 6 6

矩阵合并函数示例。

A = [2 0 -1;1 3 2]; 
B = [1 7 -1;4 2 3;2 0 1]; 
C = [1 0 1 0;-1 2 0 1]; 

得到矩阵 A、B、C。然后使用 cat 函数对矩阵 A、B 进行合并操作。

MAB1 = cat(1,A,B) % 将矩阵 A、B 按行合并
% 得到结果:
MAB1 = 
 2 0 -1 
 1 3 2 
 1 7 -1 
 4 2 3 
 2 0 1 

如果合并错误,如:

MAB2 = cat(2,A,B) % 将矩阵 A、B 按列合并
MAC1 = cat(1,A,C) % 将矩阵 A、C 按行合并
% 得到结果:
Error using cat 
CAT arguments dimensions are not consistent. 

使用 cat 函数对矩阵 A、C 进行合并操作,输入如下:

MAC2 = cat(2,A,C) % 将矩阵 A、C 按列合并
% 得到结果:
MAC2 = 
 2 0 -1 1 0 1 0 
 1 3 2 -1 2 0 1

cat 及其相关的函数在将两个矩阵按某个维度进行合并操作时,原始的两个矩阵 要在某一个维度上具有相同的长度,否则 MATLAB 在进行计算时就会发生错误。


(2)使用 blkdiag 函数构造块对角化矩阵。例如输入:

A = [1 1;2 2];B=[3 3;4 4];C=[5 5;6 6]; 
Y = blkdiag(A,B,C) 
% 得到结果:
Y = 
 1 1 0 0 0 0 
 2 2 0 0 0 0 
 0 0 3 3 0 0 
 0 0 4 4 0 0 
 0 0 0 0 5 5 
 0 0 0 0 6 6

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值