我们将开始Matlab快速入门之线性代数系列文章,共计六篇:MATLAB 环境中的矩阵、线性方程组、分解、幂和指数、特征值、奇异值。
本文主要介绍如何Matlab快速入门之线性代数中的第一篇,即,在MATLAB®中创建矩阵和执行基本矩阵计算。
MATLAB 环境使用矩阵来表示包含以二维网格排列的实数或复数的变量。更广泛而言,数组为向量、矩阵或更高维度的数值网格。MATLAB 中的所有数组都是矩形,在这种意义上沿任何维度的分量向量的长度均相同。矩阵中定义的数学运算是线性代数的主题。
创建矩阵
MATLAB 提供了许多函数,用于创建各种类型的矩阵。例如,您可以使用基于帕斯卡三角形的项创建一个对称矩阵:
>> A = pascal(3)
A =
1 1 1
1 2 3
1 3 6
您也可以创建一个非对称幻方矩阵,它的行总和与列总和相等:
>> B = magic(3)
B =
8 1 6
3 5 7
4 9 2
另一个示例是由随机整数构成的 3×2 矩形矩阵:在这种情况下,randi
的第一个输入描述整数可能值的范围,后面两个输入描述行和列的数量。
>> C = randi(10,3,2)
C =
10 9
1 9
8 1
列向量为 m×1 矩阵,行向量为 1×n 矩阵,标量为 1×1 矩阵。要手动定义矩阵,请使用方括号 [ ]
来表示数组的开始和结束。在括号内,使用分号 ;
表示行的结尾。在标量(1×1 矩阵)的情况下,括号不是必需的。例如,以下语句生成一个列向量、一个行向量和一个标量:
>> u = [3; 1; 4]
>> v = [2 0 -1]
>> s = 7
u =
3
1
4
v =
2 0 -1
s =
7
有关创建和处理矩阵的详细信息,请参阅如下几篇文章:
矩阵的加法和减法
矩阵和数组的加减法是逐个元素执行的,或者说是按元素执行的。例如,A
加 B
之后再减去 A
又可以得到 B
:
>> X = A + B
X =
9 2 7
4 7 10
5 12 8
>> Y = X - A
Y =
8 1 6
3 5 7
4 9 2
加法和减法要求两个矩阵具有兼容的维度。如果维度不兼容,将会导致错误:
>> X = A + C
错误使用 +
矩阵维度必须一致。
向量乘积和转置
长度相同的行向量和列向量可以按任一顺序相乘。其结果是一个标量(称为内积)或一个矩阵(称为外积):
>> u = [3; 1; 4];
>> v = [2 0 -1];
>> x = v*u
x =
2
>> X = u*v
X =
6 0 -3
2 0 -1
8 0 -4
对于实矩阵,转置运算对 aij 和 aji 进行交换。对于复矩阵,还要考虑是否用数组中复数项的复共轭来形成复共轭转置。MATLAB 使用撇号运算符 ('
) 执行复共轭转置,使用点撇号运算符 (.'
) 执行无共轭的转置。对于包含所有实数元素的矩阵,这两个运算符返回相同结果。
示例矩阵 A = pascal(3)
是对称的,因此 A'
等于 A
。然而,B = magic(3)
不是对称的,因此 B'
的元素是 B 的元素沿主对角线反转之后的结果:
>> B = magic(3)
B =
8 1 6
3 5 7
4 9 2
>> X = B'
X =
8 3 4
1 5 9
6 7 2
对于向量,转置会将行向量变为列向量(反之亦然):
>> x = v'
x =
2
0
-1
如果 x
和 y
均为实数列向量,则乘积 x*y
不确定,但以下两个乘积x'*y
和y'*x
产生相同的标量结果。此参数使用很频繁,它有三个不同的名称内积、标量积或点积。甚至还有一个专门的点积函数,称为 dot
。
对于复数向量或矩阵 z
,参量 z'
不仅可转置该向量或矩阵,而且可将每个复数元素转换为其复共轭数。也就是说,每个复数元素的虚部的正负号将会发生更改。以如下复矩阵为例:
>> z = [1+2i 7-3i 3+4i; 6-2i 9i 4+7i]
z =
1.0000 + 2.0000i 7.0000 - 3.0000i 3.0000 + 4.0000i
6.0000 - 2.0000i 0.0000 + 9.0000i 4.0000 + 7.0000i
z
的复共轭转置为:
>> z'
ans =
1.0000 - 2.0000i 6.0000 + 2.0000i
7.0000 + 3.0000i 0.0000 - 9.0000i
3.0000 - 4.0000i 4.0000 - 7.0000i
非共轭复数转置(其中每个元素的复数部分保留其符号)表示为 z.'
:
>> z.'
ans =
1.0000 + 2.0000i 6.0000 - 2.0000i
7.0000 - 3.0000i 0.0000 + 9.0000i
3.0000 + 4.0000i 4.0000 + 7.0000i
对于复数向量,两个标量积 x'*y
和 y'*x
互为复共轭数,而复数向量与其自身的标量积 x'*x
为实数。
矩阵乘法
矩阵乘法是以这样一种方式定义的:反映底层线性变换的构成,并允许紧凑表示联立线性方程组。如果 A 的列维度等于 B 的行维度,或者其中一个矩阵为标量,则可定义矩阵乘积 C = AB。如果 A 为 m×p 且 B 为 p×n,则二者的乘积 C 为 m×n。该乘积实际上可以使用 MATLAB for
循环、colon
表示法和向量点积进行定义:
A = pascal(3);
B = magic(3);
m = 3;
n = 3;
for i = 1:m
for j = 1:n
C(i,j) = A(i,:)*B(:,j);
end
end
MATLAB 使用星号表示矩阵乘法,如 C = A*B
中所示。矩阵乘法不适用交换律;即 A*B
通常不等于 B*A
:
>> X = A*B
X =
15 15 15
26 38 26
41 70 39
>> Y = B*A
Y =
15 28 47
15 34 60
15 28 43
矩阵可以在右侧乘以列向量,在左侧乘以行向量:
>> u = [3; 1; 4];
>> x = A*u
x =
8
17
30
>> v = [2 0 -1];
>> y = v*B
y =
12 -7 10
矩形矩阵乘法必须满足维度兼容性条件:由于 A
是 3×3 矩阵,C
是 3×2 矩阵,因此可将二者相乘得到 3×2 结果(共同的内部维度会消去):
>> X = A*C
X =
19 19
36 30
61 42
但是,乘法不能以相反的顺序执行:
>> Y = C*A
错误使用 *
内部矩阵维度必须一致。
您可以将任何内容与标量相乘:
>> s = 10;
>> w = s*y
w =
120 -70 100
当您将数组与标量相乘时,标量将隐式扩展为与另一输入相同的大小。这通常称为标量扩展。
单位矩阵
普遍接受的数学表示法使用大写字母 I 来表示单位矩阵,即主对角线元素为 1 且其他位置元素为 0 的各种大小的矩阵。这些矩阵具有以下属性:无论维度是否兼容,AI = A 和 IA = A。
原始版本的 MATLAB 不能将 I 用于此用途,因为它不会区分大小字母和小写字母,并且 i 已用作下标和复数单位。因此,引入了英语双关语。函数eye(m,n)
返回 m×n 矩形单位矩阵,eye(n)
返回 n×n 单位方阵。
矩阵求逆
如果矩阵 A
为非奇异方阵(非零行列式),则方程 AX = I 和 XA = I 具有相同的解 X。此解称为 A
的逆矩阵,表示为 A-1。inv
函数和表达式 A^-1
均可对矩阵求逆。
>> A = pascal(3)
A =
1 1 1
1 2 3
1 3 6
>> X = inv(A)
X =
3.0000 -3.0000 1.0000
-3.0000 5.0000 -2.0000
1.0000 -2.0000 1.0000
>> A*X
ans =
1.0000 0 0
0.0000 1.0000 -0.0000
0.0000 -0.0000 1.0000
通过 det
计算的行列式表示由矩阵描述的线性变换的缩放因子。当行列式正好为零时,矩阵为奇异矩阵,因此不存在逆矩阵。
>> d = det(A)
d =
1
有些矩阵接近奇异矩阵,虽然存在逆矩阵,但计算容易出现数值误差。cond
函数计算逆运算的条件数,它指示矩阵求逆结果的精度。条件数的范围是从 1
(数值稳定的矩阵)到 Inf
(奇异矩阵)。
>> c = cond(A)
c =
61.9839
很少需要为某个矩阵构造显式逆矩阵。当解算线性方程组 Ax = b 时,往往会错误使用 inv
。从执行时间和数值精度方面而言,求解此方程的最佳方法是使用矩阵反斜杠运算符,即 x = A\b
。有关详细信息,请参阅 mldivide
。
Kronecker 张量积
两个矩阵的 Kronecker 乘积 kron(X,Y)
为 X
的元素与 Y
的元素的所有可能乘积构成的较大矩阵。如果 X
为 m×n 且 Y
为 p×q,则 kron(X,Y)
为 mp×nq。元素以特定方式排列,呈现 X
的每个元素分别与整个矩阵 Y
相乘的结果。
[X(1,1)*Y X(1,2)*Y . . . X(1,n)*Y
. . .
X(m,1)*Y X(m,2)*Y . . . X(m,n)*Y]
Kronecker 乘积通常与元素为 0 和 1 的矩阵配合使用,以构建小型矩阵的重复副本。例如,如果 X
为 2×2 矩阵,且 I = eye(2,2)
为 2×2 单位矩阵,则:
>> X = [1 2
3 4]
X =
1 2
3 4
>> I = eye(2,2)
I =
1 0
0 1
>> kron(X,I)
ans =
1 0 2 0
0 1 0 2
3 0 4 0
0 3 0 4
>> kron(I,X)
ans =
1 2 0 0
3 4 0 0
0 0 1 2
0 0 3 4
除了 kron
之外,对复制数组有用的其他函数还有 repmat
、repelem
和 blkdiag
。
向量范数和矩阵范数
向量 x 的 p-范数
使用 norm(x,p)
进行计算。此运算是为 p > 1 的任意值定义的,但最常见的 p 值为 1、2 和 ∞。默认值为 p = 2,这与欧几里德长度或向量幅值对应:
>> v = [2 0 -1];
>> [norm(v,1) norm(v) norm(v,inf)]
ans =
3.0000 2.2361 2.0000
矩阵 A 的 p-范数,
可以针对 p = 1、2 和 ∞ 通过 norm(A,p)
进行计算。同样,默认值也为 p = 2:
>> A = pascal(3);
>> [norm(A,1) norm(A) norm(A,inf)]
ans =
10.0000 7.8730 10.0000
如果要计算矩阵的每行或每列的范数,可以使用 vecnorm
:Matlab R2016a之前没有这个函数
vecnorm(A)
ans =
1.7321 3.7417 6.7823
使用线性代数方程函数的多线程计算
对于许多线性代数函数和按元素的数值函数,MATLAB 软件支持多线程计算。这些函数将自动在多个线程上执行。要使函数或表达式在多个 CPU 上更快地执行,必须满足许多条件:
- 函数执行的运算可轻松划分为并发执行的多个部分。这些部分必须能够在进程之间几乎不通信的情况下执行。它们应需要很少的序列运算。
- 数据大小足以使并发执行的任何优势在重要性方面超过对数据分区和管理各个执行线程所需的时间。例如,仅当数组包含数千个或以上的元素时,大多数函数才会加速。
- 运算未与内存绑定;处理时间不受内存访问时间控制。一般而言,复杂函数比简单函数速度更快。
对于大型双精度数组(约 10,000 个元素),矩阵乘法 (X*Y)
和矩阵乘幂 (X^p)
运算符会大幅增加速度。矩阵分析函数 det
、rcond
、hess
和 expm
也会对大型双精度数组大幅增加速度。
转载文章,原文出处:MathWorks官网,由古哥整理发布
如若转载,请注明出处:https://iymark.com/articles/3191.html