目录
介绍
一、数组的创建和操作
通过 : 创建一维数组
通过logspace函数创建一维数组
通过linspace函数创建一维数组
二、数组的运算
数组的关系运算
数组的逻辑运算
三、矩阵
矩阵的构造
矩阵的下标引用
矩阵大小
四、矩阵元素的运算
矩阵的差分
矩阵运算
矩阵分析
矩阵分解
福利:文末有MATLAB全套资料哦
可以说,数组运算是 MATLAB 计算的基础,而数值数组是 MATLAB 最重要的一种内建数据类型。矩阵本身就是特殊的数组,MATLAB 本意就是矩阵实验室,可见数组与矩阵的重要性。
数组中同一行的元素使用逗号 ,
或者空格进行分隔,不同行之间用分号 ;
进行分隔。
>> A = [6 5 4 3 2 1]
A = 6 5 4 3 2 1
>> B = [6, 5, 4, 3, 2, 1]
B = 6 5 4 3 2 1
>> C = [6;5;4;3;2;1]
C =
6
5
4
3
2
1
>> D = B' % 转置
D =
6
5
4
3
2
1
需要注意的是,访问数组元素使用的是小括号 ()
,而不是大多数编程语言所使用的 []
。除此之外, MATLAB 数组下标是从1开始的,也允许传入一个下标列表,实现多个元素的查询和修改。(这点上和Julia是一致的):
>> A = [6 5 4 3 2 1]
A = 6 5 4 3 2 1
>> A(3) = 0
A = 6 5 0 3 2 1
>> A([1 4]) = [1 1]
A = 1 5 0 1 2 1
在 MATLAB 中,可以通过 :
创建一维数组 X=A:step:B
,其中, A
是创建一维数组的第一个变量, step
是每次递增或递减的数值,直到最后一个元素和 B 的差的绝对值小于等于 step
的绝对值。如果没有指定 step
,则默认会以一个单位长度进行增加。
>> 2:6
ans = 2 3 4 5 6
>> 2.1:1.5:6
ans = 2.1000 3.6000 5.1000
>> 2.1:6
ans = 2.1000 3.1000 4.1000 5.1000
>> 2.1:-1.5:-6
ans = 2.1000 0.6000 -0.9000 -2.4000 -3.9000 -5.4000
y=logspace(a,b)
: 创建行向量 y
,第一个元素是 10^a,最后一个元素是 10^b,形成总数为 50 个元素的等比数列。
y=logspace(a,b,n)
: 该函数创建行向量 y
,第一个元素是 10^a,最后一个元素是 10^b,形成总数为 n 个元素的等比数列。
>> A = logspace(1, 2, 10)
A = 10.0000 12.9155 16.6810 21.5443 27.8256 35.9381 46.4159 59.9484 77.4264 100.0000
y=linspace(a,b)
: 创建行向量 y
,第一个元素是 a,最后一个元素是 b,形成总数为 100 个元素的线性间隔向量(等差数列)。
y=logspace(a,b,n)
: 该函数创建行向量 y
,第一个元素是 a,最后一个元素是 b,形成总数为 n 个元素的线性间隔向量(等差数列)。
>> A = linspace(1, 100)
A =
1 至 21 列
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
22 至 42 列
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
43 至 63 列
43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
64 至 84 列
64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
85 至 100 列
85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
>> B = linspace(1, 36, 1)
B =
36
数组的运算是从数组这一整个元素出发,对其中的每一个元素进行的运算。基本运算包括加、减、乘、左除、右除和乘方。
>> A = [1 5 6 8 9 6]
A = 1 5 6 8 9 6
>> B = [9 85 6 2 4 0]
B = 9 85 6 2 4 0
>> C = [1 1 1 1 1]
C = 1 1 1 1 1
>> D = A + B
D = 10 90 12 10 13 6
>> E = A - B
E = -8 -80 0 6 5 6
>> F = A * 2
F = 2 10 12 16 18 12
>> G = A + 3
G = 4 8 9 11 12 9
>> H = A - G
H = -3 -3 -3 -3 -3 -3
需要注意的是,数组的乘法不同于矩阵的乘法。它要求 A
和 B
的维度相同,运算为数组对应元素的乘法运算,计算结果是与 A
和 B
相同维度的数组。自然地,对于除法,则对应的元素进行相除。
>> A = [1 2 3]
A = 1 2 3
>> B = [2 3 4]
B = 2 3 4
>> C = A .* B % 数组的点乘
C = 2 6 12
>> D = A * 3 % 数组与常数的乘法
D = 3 6 9
数组除法:
>> A = [1 2 3]
A = 1 2 3
>> B = [2 3 4]
B = 2 3 4
>> A ./ B % 左除
ans = 0.5000 0.6667 0.7500
>> A .\ B % 右除,等价于 B ./ A
ans = 2.0000 1.5000 1.3333
>> B / 2
ans = 1.0000 1.5000 2.0000
数组的乘方:
>> A = [1 2 3 4]
A = 1 2 3 4
>> B = [1 2 3 4]
B = 1 2 3 4
>> C = A .^ B % 数组的乘方
C = 1 4 27 256
>> D = 3 .^ A % 常数与数组的乘方
D = 3 9 27 81
通过函数 dot()
可实现数组的点积运算,但是运算规则要求数组 A
和 B
的维度相同,调用格式:
C=dot(A,B)
C=dot(A,B,dim)
>> A = [1 2 3 4]
A = 1 2 3 4
>> B = [1 2 3 4]
B = 1 2 3 4
>> dot(A, B)
ans = 30
MATLAB 提供 6 种数组关系运算符,即 <
(小于)、 <=
(小于等于)、 >
(大于)、 >=
(大于等于)、 ==
(恒等于)、 ~=
(不等于)。 运算规则:
标量之间直接比较大小,关系成立,返回1,否则返回0。
比较量是维度相等的数组时,逐一比较相同位置的元素,并给出比较结果。最终结果是一个与参与比较的数组维数相同的数组,其组成元素为 0 或 1。
>> A = [1 2 3 4 5]
A = 1 2 3 4 5
>> B = [0 2 3 4 5]
B = 0 2 3 4 5
>> A > B
ans =
1×5 logical 数组
1 0 0 0 0
>> A >= 3
ans =
1×5 logical 数组
0 0 1 1 1
MATLAB 中数组提供了3种逻辑运算符: &
(与)、 |
(或)和 ~
(非)。如果是非零元素则为真,用1表示。零元素则为假,用0表示。
>> A = [1 2 3 4 5 6]
A = 1 2 3 4 5 6
>> B = [0 1 2 3 4 5]
B = 0 1 2 3 4 5
>> A & B
ans =
1×6 logical 数组
0 1 1 1 1 1
>> A | B
ans =
1×6 logical 数组
1 1 1 1 1 1
>> ~B
ans =
1×6 logical 数组
1 0 0 0 0 0
矩阵和数组在 MATLAB 中有很多方面的区别,比如:
矩阵是数学上的概念,而数组是计算机程序设计领域的概念;
作为数学上变换或映射算符的体现,矩阵运算有着明确而严格的数学规则。数组运算则是 MATLAB 软件定义的规则,目的是为了使数据管理更加方便。
两种之间的联系是,矩阵是以数组的形式存在的。因此,一维数组相当于向量,二维数组相当于矩阵,换句话说,矩阵是数组的子集。
矩阵的构造方式有两种,一种与单元数组相似,可以对变量直接进行赋值;另一种是使用预先提供的特殊矩阵的命令。
函数名称 | 函数功能 |
---|---|
ones(n) |
n×n的1矩阵(元素都是1) |
zeros(n) |
n×n的0矩阵(元素都是0) |
eye(n) |
n×n的单位矩阵 |
eye(m,n) |
m×n的单位矩阵 |
rand(n) |
n×n的矩阵,元素0-1之间均匀分布的随机数 |
diag(x) |
主对角线元素取自向量 x ,其余元素的值为0 |
triu(A) |
构建和A相同的上三角矩阵,主对角线上元素为A中对应元素, 其余为0 |
tril(A) |
构建和A相同的下三角矩阵,主对角线上元素为A中对应元素, 其余为0 |
还有其它的矩阵类型,例如魔方矩阵
magic
、帕斯卡矩阵pascal
、范德蒙(Vandermonde)矩阵等等。
>> A = ones(3)
A =
1 1 1
1 1 1
1 1 1
>> B = rand(3)
B =
0.8147 0.9134 0.2785
0.9058 0.6324 0.5469
0.1270 0.0975 0.9575
>> C = [1 2 3; 4 5 6; 7 8 9]
C =
1 2 3
4 5 6
7 8 9
>> triu(C)
ans =
1 2 3
0 5 6
0 0 9
普通的二维数组元素的索引分为双下标索引和单下标索引。双下标索引索引通过一个二元数组来对应元素在矩阵中的行列位置,例如:A(2, 3)表示矩阵A中第2行第3列的元素。单下标索引的方式是采用列元素优先的原则,对 m
行 n
列的矩阵按列排序进行重组,例如在3×3的矩阵中,A(5)表示第3行第2列的元素。
表达式 | 功能 |
---|---|
A(1) |
将二维矩阵A重组为一维数组,返回数组中的第一个元素 |
A(:,j) |
返回二维矩阵A中第j列列向量 |
A(i,:) |
返回二维矩阵A中第i行行向量 |
A(:,j:k) |
返回二维矩阵A中的第j列到第k列列向量组成的子矩阵 |
A(i:k,:) |
返回二维矩阵A中的第i行到第k行行向量组成的子矩阵 |
A(:) |
将矩阵A中的每列合并成一个长的列向量 |
矩阵结构测试:
名称 | 功能 |
---|---|
isempty(A) |
检测矩阵是否为空 |
isscalar(A) |
检测矩阵是否是单元素的标量矩阵 |
isvector(A) |
检测矩阵是否只具有一行或一列元素的一维向量 |
issparse(A) |
检测数组是否是稀疏矩阵 |
>> A = magic(3)
A =
8 1 6
3 5 7
4 9 2
>> A(5)
ans = 5
>> B = [1]
B = 1
>> isempty(B)
ans =
logical
0
>> isscalar(B)
ans =
logical
1
矩阵的大小通常包含以下几个方面的内容:维数、各个维的长度、矩阵元素的个数。为此,MATLAB 提供了4个函数,分别用于获取矩阵形状的相关信息。
调用格式 | 功能 |
---|---|
n=ndims(X) |
获取矩阵的数量 |
[m,n]=size(X) |
获取矩阵在各个维度上的长度 |
n=length(X) |
获取矩阵最长维的长度 |
n=numel(X) |
获取矩阵元素的个数 |
>> A = eye(5, 3)
A =
1 0 0
0 1 0
0 0 1
0 0 0
0 0 0
>> ndims(A)
ans = 2
>> length(A)
ans = 5
>> numel(A)
ans = 15
优化 MATLAB 代码的其中一个关键点就是要了解矩阵的内存使用情况。可以使用 whos
查看当前工作区中指定变量的所有信息,包括变量名、矩阵大小、内存占用和数据类型等等。
>> m = rand(2)
m =
0.9649 0.9706
0.1576 0.9572
>> whos m
Name Size Bytes Class Attributes
m 2x2 32 double
使用矩阵运算,需要遵循数学上对矩阵的定义。例如矩阵的加法和减法运算的前提是参与运算的两个矩阵或多个矩阵必须具有相同的行数和列数。
满足:交换律A+B=B+A、结合律A+(B+C)=(A+B)+C、存在零元A+0=0+A=A、存在负元A+(-A)=(-A)+A
矩阵乘法运算包括数与矩阵的乘法、矩阵与矩阵的乘法。矩阵与矩阵的乘法必须满足被乘矩阵的列数与乘矩阵的行数相等。除此之外,矩阵之间的乘法不遵循交换律,但是满足以下的运算律:
结合律:(A×B)×C=A×(B×C)
左分配律:A×(B+C)=A×B+A×C
右分配律:(B+C)×A=B×A+C×A
单位矩阵的存在性:E×A=A, A×E=A
矩阵除法是乘法的逆运算,分为左除和右除两种。使用运算符号 \
和 /
表示。对于一般的二维矩阵 A 和 B,当进行A\B运算时,要求 A 的行数与 B 的行数相等;当进行A/B运算时,要求A和B的列数相等。
>> A = [1 2; 1 3];
>> B = [1 0; 1 2];
>> C = A / B
C =
0 1.0000
-0.5000 1.5000
>> D = A\B
D =
1 -4
0 2
>> C * B
ans =
1 2
1 3
>> A * D
ans =
1 0
1 2
矩阵为方阵时,可以进行矩阵的幂运算,MATLAB 使用 ^
表示幂运算:
>> A = magic(3)
A =
8 1 6
3 5 7
4 9 2
>> A2 = A^2
A2 =
91 67 67
67 91 67
67 67 91
diff()
作用是计算矩阵的差分。简而言之,将矩阵中,上一行(列)与下一行(列)的差值,依次排列在上一行(列)的对应所在位置。
Y=diff(X,n)
:计算矩阵各列元素的n阶差分。
Y=diff(X,n,dim)
:计算矩阵在给定的维数 dim
上元素的 n
差分。当 dim=1
时,计算矩阵各列元素的差分。当 dim=2
时,计算矩阵各行元素的差分。
>> A = magic(3)
A =
8 1 6
3 5 7
4 9 2
>> B = diff(A)
B =
-5 4 1
1 4 -5
>> C = diff(A, 2)
C =
6 0 -6
>> D = diff(A, 1, 2)
D =
-7 5
2 2
5 -7
矩阵运算是线性代数中极其重要的部分,包括矩阵分析、特征值求解和奇异值。
MATLAB 提供的矩阵分析函数如下:
函数名 | 描述 |
---|---|
norm |
求矩阵或者向量的范数 |
normest |
估计矩阵的2阶范数 |
rank |
矩阵的秩 |
det |
矩阵的行列式 |
trace |
矩阵的迹,即求对角元素的和 |
null |
0空间 |
orth |
正交化空间 |
rref |
约化行阶梯形式 |
subspace |
求两个矩阵空间的角度 |
>> norm(1:6, 2) % 2阶范数
ans = 9.5394
>> normest(1:6)
ans = 9.5394
当矩阵维数比较大时,会导致计算范数的时间比较长,并且当一个近似的范数值满足要求时,可以考虑使用函数
normset()
来估计 2 阶范数值。
>> A = [1 2 3; 3 4 5; 7 8 9];
>> B = magic(3);
>> r1 = rank(A)
r1 = 2
>> r2 = rank(B)
r2 = 3
>> det(B)
ans = -360
>> trace(B)
ans = 15
>> Z = null(A)
Z =
0.4082
-0.8165
0.4082
矩阵分解是把一个矩阵分解成几个“较简单”的矩阵连乘形式,无论在理论上还是工程应用上,矩阵分解都是十分重要的。
名称 | 描述 |
---|---|
chol |
Cholesky 分解 |
choline |
稀疏矩阵的不完全 Cholesky 分解 |
lu |
矩阵 LU 分解 |
luinc |
稀疏矩阵的不完全 LU 分解 |
qr |
正交三角分解 |
svd |
奇异值分解 |
gsvd |
一般奇异值分解 |
schur |
舒尔分解 |
示 充电君会在第一时间给你带来最新、最全面的解读,别忘了三联一波哦。
关注公众号:资源充电吧
回复:Chat GPT
充电君发你:免费畅享使用中文版哦
点击小卡片关注下,回复:IT
想要的资料全都有