第04讲 矩阵的基础知识
作者:欧新宇(Xinyu OU)
本文档所展示的测试结果,均运行于:Intel Core i7-7700K CPU 4.2GHz
【学习目标】
矩阵的定义及基本操作 基于矩阵的向量 特殊形态的矩阵 矩阵的四则运算 矩阵的秩和矩阵的迹 矩阵的分块
张量的常用操作 矩阵的应用
【本章要点】
在数学中,矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合,最早来自于方程组的系数及 常数所构成的方阵。这一概念由19世纪英国数学家凯利首先提出。作为解决线性方程的工具,矩阵也有 不短的历史。成书最早在东汉前期的《九章算术》中,用分离系数法表示线性方程组,得到了其增广矩 阵。在消元过程中,使用的把某行乘以某一非零实数、从某行中减去另一行等运算技巧,相当于矩阵的 初等变换。但那时并没有现今理解的矩阵概念,虽然它与现有的矩阵形式上相同,但在当时只是作为线 性方程组的标准表示与处理方式。
学习线性代数的主要目标就是:学会利用矩阵来描述系统,并用矩阵软件工具去解决各种问题。
1. 矩阵的定义及基本操作
1.1 矩阵的定义
【定义】:由 m×n 个数(i=1,2,…,m; j=1,2,…,n) 排成的 m 行 n 列的矩形数表就称为矩阵。如下所示,可 以试用黑体加粗斜体大些英文字母来表示一个矩阵。
矩阵A 称为 m 行 n 列矩阵,简称 m×n (阶)矩阵。为表示它是一个整体,总是加一个括弧或者方括号来 表示它。矩阵中的 m×n 个数称为矩阵A的元素,其中 表示矩阵A的第 i 行第 j 列元素。m×n 矩阵也 可以被记作 。
在python中,一般使用numpy数组来表示矩阵,实际上对于包括向量、矩阵及张量在内,都习惯使用 numpy数组来表示,我们可以使用numpy.array()来实现对数组的定义。
下面将给出基于numpy中矩阵(二维数组)的创建和形态的Python代码。
【结果分析】
在对矩阵的形态进行描述和分析的时候,通常使用矩阵的行数和列数进行描述。对应到Python代码,可 以使用矩阵的shape属性来表示。.shape属性会以一个二维元组来给出结果,其中第一个值为矩阵的行 数,第二个值为矩阵的列数。例如上例中,矩阵A是一个4行2列的矩阵。
关于numpy数组的更多基本描述可以参考以下链接:
【知识点】:Numpy基础计算库极简使用说明
Numpy中也有numpy.mat和numpy.matrix,.mat是array的一个子集,同时拥有更方便的计算方 法,但没有array那么通用,它只适用于二维。.matrix有一些独有的特性,例如在进行符号运算的时 候,就必须使用.matrix类型,我们将在第5章线性方程组中进行讨论使用。
1.2 同型矩阵及矩阵相等
【定义】如果两个矩阵的行数相等、列数也相等,则称它们为同型矩阵。
若矩阵 与矩阵 是同型矩阵,并且所有所有对应位置的元素均相等,即:
, 那么就称矩阵A与矩阵B相等,记作: 。
1.3 矩阵的转置
import numpy as np A = np.array([
[1, 2], [3, 4], [5, 6], [7, 8]])
print("矩阵A = \n{}".format(A))
print("矩阵A的形态为:{}".format(A.shape))
矩阵A = [[1 2]
[3 4]
[5 6]
[7 8]]
矩阵A的形态为:(4, 2)
import numpy as np
A1 = np.array([[1,2,3],[4,5,6]]) A2 = np.array([[1,2,3],[4,5,6]]) A3 = np.array([[1,1,1],[2,2,2]]) A4 = np.array([[1,1,1,1],[2,2,2,4]])
print("A1与A2的形态相同:{},A1与A2相等:{}。".format(A1.shape==A2.shape, (A1==A2).all())) # = 是赋值,== 是对比逻辑相等
print("A1与A3的形态相同:{},A1与A3相等:{}。".format(A1.shape==A3.shape, (A1==A3).all()))
A1与A2的形态相同:True,A1与A2相等:True。
A1与A3的形态相同:True,A1与A3相等:False。
【定义】矩阵的转置:转置是矩阵的重要操作之一,矩阵的转置是以对角线为轴的镜像,这条对角线从 左上角到右下角被称为主对角线。我们将矩阵 的转置表示为 ,定义如下:
具体而言:
标量的转置:标量可以看成是只有一个元素的矩阵。因此,标量的转置等于它本身,即: 。 向量的转置:向量可以看作是只有一列(行)的矩阵。因此,向量的转置可以看作是只有一行
(列)的矩阵。
若将向量元素作为行向量写在文本行中,则可以通过转置将其转换为标准的列向量,比如:
。
若将向量直接写在文本行中,则向量 本身就是标准列向量,其转置 为行向量。
矩阵的转置也是一种运算,满足下述运算规律(假设运算都是可行的):
可以脱括号,但是要注意顺序
【定义】 给定矩阵 , 若将其行和列的元素进行位置互换,可以得到一个新的矩阵 。那么矩阵 就称为矩阵 的转置(Transpose)矩阵,并记作 。同时,矩阵 也称为矩阵 的转置矩阵。行 和列的互换操作就称为矩阵的转置。
【例3.1】 下面给出矩阵 的转置的Python代码:
注意向量(一维数组)无法执行转置运算。
import numpy as np
A = np.array([[1,2,3,4],[5,6,7,8]])
print('矩阵A = \n{}\n'.format(A)) print('矩阵A的转置 = \n{}'.format(A.T))
矩阵A = [[1 2 3 4]
[5 6 7 8]]
矩阵A的转置 = [[1 5]
[2 6]
[3 7]
[4 8]]
【例3.2】 已知
, ,求 。
此处只给出Python代码的实现方法:
【结果分析】
在进行矩阵转置的时候,要特别注意在进行矩阵运算的时候,乘法交换律是不满足的,因此:
。
1.4 矩阵的Frobenius范数
弗罗贝尼乌斯范数(Frobenius范数):简称为F范数,是一种定义在矩阵上的范数,用于衡量矩阵的大 小。F范数表示矩阵中各元素的平方和开方。矩阵 的Frobenius范数为:
在Python中,我们可以使用 np.linalg.norm(A) 来求矩阵的F范数。当A为矩阵时,
np.linalg.norm() 方法默认为F范数。
2. 基于矩阵的向量
为了规范和便于计算,所有的量(向量、矩阵、张量)都规范成张量,并同时使用矩阵(张量)来进行 表示。在程序中,我们统一使用numpy数组来表示这种量。此时,
一个 的行向量 就表示成一个只有一行的矩阵; 一个 的列向量 则表示成一个只有一列的矩阵。 import numpy as np
A = np.array([[2,0,-1],[1,3,2]])
B = np.array([[1,7,-1],[4,2,3],[2,0,1]]) print(np.dot(A,B).T)
print(np.dot(B.T,A.T))
[[ 0 17]
[14 13]
[-3 10]]
[[ 0 17]
[14 13]
[-3 10]]
import numpy as np
A = np.array([[1,1,2],[1,1,1]]) print(np.linalg.norm(A))
3.0
import numpy as np
a = np.array([[1,2,3,4]]) print("a={}".format(a)) print("b=\n{}".format(a.T))
方阵 对称矩阵 零矩阵 对角矩阵 三角矩阵 单位矩阵
逆矩阵 正定矩阵 半正定矩阵 负定矩阵 正交矩阵
【结果分析】
从结果可以看到,我们使用一个二维数组来显示向量(两层中括号),这种方法基本上贯穿于整个计算 机领域。其中 a 用来表示一个四维行向量(二阶张量) ,b 表示一个四维列向量(二阶张量) 。
3. 特殊形态的矩阵
3.1 方阵
【定义】 行数和列数相等的矩阵称为方阵,即存在 。方阵的行数或列数称为矩阵的 阶数。例如,一个 阶矩阵可记为 。
下面给出一个3阶和一个5阶矩阵的Python代码。
3.2 对称矩阵
【定义】给定矩阵 ,若其转置矩阵 与原矩阵相等,即 ,则矩阵 称为对称矩阵。不 难发现,矩阵对称的前提条件有两点:
1. 矩阵A是一个方阵
2. 矩阵A的每一个元素都满足 $A_{ij}=A_{ji}$
给定矩阵A,我们可以得到A的对称矩阵B。
a=[[1 2 3 4]]
b=
[[1]
[2]
[3]
[4]]
import numpy as np
A = np.array([[1,2,3],[4,5,6],[7,8,9]])
B = np.array([[1,1,1,1,1],[2,2,2,2,2],[3,3,3,3,3],[4,4,4,4,4],[5,5,5,5,5]])
print("矩阵A=\n{}, \n 矩阵B=\n{}".format(A,B))
print("矩阵A的形态为:{},矩阵B的形态为:{}".format(A.shape, B.shape))
矩阵A=
[[1 2 3]
[4 5 6]
[7 8 9]], 矩阵B=
[[1 1 1 1 1]
[2 2 2 2 2]
[3 3 3 3 3]
[4 4 4 4 4]
[5 5 5 5 5]]
矩阵A的形态为:(3, 3),矩阵B的形态为:(5, 5)
矩阵A为对称矩阵,且矩阵A和B互为对称矩阵。
3.3 零矩阵
所有元素都为0的矩阵称为零矩阵,记作 O。此外还可以通过下标方法标识出零矩阵的形态,例如一个 4×5的零矩阵,可以表示为 。
值得注意的是,不同型的零矩阵是不同的,例如: 。 零矩阵最重要的作用就是用来初始化矩阵,
一方面可以使用零矩阵来表示实际存储数据矩阵的规模,达到初始化矩阵和申请内存空间的功能;
另一方面零矩阵也是占用存储空间最小的矩阵。
import numpy as np
A = np.array([[1,5,6,7],[5,2,8,9],[6,8,3,0],[7,9,0,4]])
print("矩阵A = \n{}\n".format(A))
print("矩阵A的对称矩阵(转置矩阵)B = \n{}\n".format(A.T))
矩阵A = [[1 5 6 7]
[5 2 8 9]
[6 8 3 0]
[7 9 0 4]]
矩阵A的对称矩阵(转置矩阵)B = [[1 5 6 7]
[5 2 8 9]
[6 8 3 0]
[7 9 0 4]]
import numpy as np A = np.zeros([4,5]) print(A)
[[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]
[0. 0. 0. 0. 0.]]
【结果分析】
值得注意的的是,在上面的代码中,我们一般使用(A==B).any()或者(A==B).all()来对两个数组进 行全匹配,或者使用(A==B)对两个数组进行按位匹配。但对于两个形态不同的矩阵,我们无法使用前 面的两种方法来进行对比,强行对比可以得到结果,但是同时也会输出一个警告。更常用的方法是,先 判断两个矩阵的形态是否完全一致,例如:A.shape==B.shape。
任意匹配:(A==B).any() 所有匹配:(A==B).all() 按位匹配:(A==B)
形态匹配:A.shape==B.shape
3.4 对角矩阵
【定义】 一个n阶方阵的左上角与右下角之间的连线称为它的主对角线。除了主对角线上的元素外所有 的元素都为0,这种矩阵就称为** 对角矩阵**,即: 。
在对角矩阵中,为0的元素位置可以省去不写。
import numpy as np A1 = np.zeros([4,5]) A2 = np.zeros([2,3]) A3 = np.zeros([4,5])
print("A1 = A2 is {}。".format(A1==A2))
print("A1 = A3 is {}。".format((A1==A3).any()))
A1 = A2 is False。
A1 = A3 is True。
C:\ProgramData\Anaconda3\lib\site-packages\ipykernel_launcher.py:5:
DeprecationWarning: elementwise comparison failed; this will raise an error in the future.
"""
if A1.shape == A3.shape:
print((A1 == A3).all()) else:
print('两个矩阵形态不同,无法对比')
True
import numpy as np A = np.diag([1,2,3,4,5]) print(A)
3.5 上三角矩阵和下三角矩阵
【定义】 主对角线下方的元素全为零的方阵称为上三角矩阵,主对角线上方的元素全为零的方阵称为下 三角矩阵。
在对角矩阵中,为0的元素位置可以省去不写。
3.6 单位矩阵
【定义】 在对角矩阵中,如果对角线上的元素都为1,则该矩阵称为单位矩阵。任意矩阵和单位矩阵相 乘,都不会改变。我们把 阶单位矩阵记作 (在有些文献中也被记作 ),形式上:
。例如:
3.7 逆矩阵
逆矩阵的定义
矩阵A的逆矩阵记作 ,其定义的矩阵满足如下条件:
通常可以通过矩阵逆解的式求解逆矩阵,但是首先需要考虑逆矩阵是否存在。更一般地说,相同的逆矩 阵可以用于多次求解不同向量b的方程,如后续的基底变换。但实际应用中,逆矩阵主要作为理论工 具,因为逆矩阵 在数字计算机上只能表现有限的精度。
求解逆矩阵,在python中可以通过如下代码实现:
逆矩阵的性质 [[1 0 0 0 0]
[0 2 0 0 0]
[0 0 3 0 0]
[0 0 0 4 0]
[0 0 0 0 5]]
import numpy as np I = np.eye(4) print(I)
[[1. 0. 0. 0.]
[0. 1. 0. 0.]
[0. 0. 1. 0.]
[0. 0. 0. 1.]]
from scipy import linalg linalg.inv(A)
1. 如果矩阵 可逆,则 的逆矩阵唯一。
2. 若 、 为同阶可逆方阵,且满足 ,则 ,即 和 互逆 3. 若 可逆,则 也可逆,且 。
4. 若 可逆,数 ,则 可逆,且
5. 若 、 均为 阶可逆方阵,则 也可逆,且 。此性质可推广至 个同阶 方阵连乘的情况:
3.8 正交矩阵
正交矩阵:逆矩阵等于它的转置矩阵的方阵。正交矩阵的行向量和列向量分别都是标准正交,即该矩阵 的一个内积空间的正交基是元素两两正交的基,这意味着基向量的模长都是单位长度。
正交矩阵求逆矩阵的代价很小,因此备受关注,此外,它还具有很多有趣的性质,例如:
1.
2. 也是正交矩阵;
3. 的行列式值等于 或 ;
4. 的各行(列)是单位向量,且两两正交
3.9 正定矩阵、半正定矩阵和负定矩阵
正定矩阵(Positive Definite Matrix):对于矩阵 ,任意非零向量 ,都有: 。 半正定矩阵(Positive Semidefinite Matrix):对于矩阵 ,任意非零向量 ,都有: 。 负定矩阵(Negative Definite Matrix):对于矩阵 ,任意非零向量 ,都有: 。 对于以上三种特殊矩阵,它们都有很多不同的判定方法和性质,目前只需要记得它们的定义即可。