方阵、单位矩阵和零矩阵等基本类型显现出在方阵中某些结构模式,这些模式在计算中特别有用。我们来看看对角矩阵和三角矩阵。对角矩阵对角矩阵是一种方阵,其主对角线 以外 的所有元素都为零。主对角线上的元素可以是任何值,包括零。对角矩阵和三角矩阵是方阵的特定类型,它们具有独特的结构模式。这些模式能够简化线性代数中的大量计算和分析过程。理解这些特殊矩阵形式,有助于掌握高效方法,同时与在单位矩阵和零矩阵等基本矩阵中观察到的性质相呼应。这是一个 $3 \times 3$ 的例子:$$ D = \begin{pmatrix} 7 & 0 & 0 \ 0 & -2 & 0 \ 0 & 0 & 3 \end{pmatrix} $$请注意,只有元素 $a_{11}$、$a_{22}$ 和 $a_{33}$(主对角线)可能不是零。我们之前见到的单位矩阵 $I$ 是对角矩阵的一种特殊情况,其所有对角线元素都恰好为1。对角矩阵在计算上很方便。处理对角矩阵时,许多运算会大大简化。使用NumPy创建对角矩阵NumPy提供了方便的 np.diag() 函数。此函数有两种行为模式:如果你将一维数组(如列表或NumPy向量)传递给 np.diag(),它会创建一个方阵,将这些元素放在主对角线上,其他位置为零。如果你将二维数组(一个矩阵)传递给 np.diag(),它会 提取 主对角线元素,并将其作为一维数组返回。我们来看看如何创建一个对角矩阵:import numpy as np # 从对角线元素列表创建对角矩阵 diag_elements = [4, -1, 6] D = np.diag(diag_elements) print("对角线元素:", diag_elements) print("结果对角矩阵 D:\n", D)Output:Diagonal elements: [4, -1, 6] Resulting diagonal matrix D: [[ 4 0 0] [ 0 -1 0] [ 0 0 6]]现在,我们从一个现有矩阵中提取对角线:# 一个示例矩阵 A = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]) # 提取主对角线 diagonal_of_A = np.diag(A) print("原始矩阵 A:\n", A) print("提取出的对角线:", diagonal_of_A)Output:Original matrix A: [[1 2 3] [4 5 6] [7 8 9]] Extracted diagonal: [1 5 9]三角矩阵三角矩阵是方阵,其所有零元素要么在主对角线上方,要么在主对角线下方。它们有两种类型:上三角矩阵上三角矩阵其所有非零元素都在主对角线上方或主对角线上。主对角线 下方 的所有元素都为零。形式上,对于矩阵 $U$,如果 $i > j$,则 $u_{ij} = 0$。例子:$$ U = \begin{pmatrix} 1 & 2 & 3 \ 0 & 5 & 6 \ 0 & 0 & 9 \end{pmatrix} $$下三角矩阵反之,下三角矩阵其所有非零元素都在主对角线下方或主对角线上。主对角线 上方 的所有元素都为零。形式上,对于矩阵 $L$,如果 $i < j$,则 $l_{ij} = 0$。例子:$$ L = \begin{pmatrix} 1 & 0 & 0 \ 4 & 5 & 0 \ 7 & 8 & 9 \end{pmatrix} $$结构可视化“上”和“下”的名称源于非零元素形成三角形的形状。digraph G { rankdir=LR; node [shape=plaintext]; subgraph cluster_D { label = "对角矩阵 (D)"; style=dashed; D [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> <TR><TD BGCOLOR="#74c0fc">d<SUB>1</SUB></TD><TD>0</TD><TD>0</TD></TR> <TR><TD>0</TD><TD BGCOLOR="#74c0fc">d<SUB>2</SUB></TD><TD>0</TD></TR> <TR><TD>0</TD><TD>0</TD><TD BGCOLOR="#74c0fc">d<SUB>3</SUB></TD></TR> </TABLE>>]; } subgraph cluster_U { label = "上三角矩阵 (U)"; style=dashed; U [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> <TR><TD BGCOLOR="#96f2d7">u<SUB>11</SUB></TD><TD BGCOLOR="#96f2d7">u<SUB>12</SUB></TD><TD BGCOLOR="#96f2d7">u<SUB>13</SUB></TD></TR> <TR><TD>0</TD><TD BGCOLOR="#96f2d7">u<SUB>22</SUB></TD><TD BGCOLOR="#96f2d7">u<SUB>23</SUB></TD></TR> <TR><TD>0</TD><TD>0</TD><TD BGCOLOR="#96f2d7">u<SUB>33</SUB></TD></TR> </TABLE>>]; } subgraph cluster_L { label = "下三角矩阵 (L)"; style=dashed; L [label=<<TABLE BORDER="0" CELLBORDER="1" CELLSPACING="0"> <TR><TD BGCOLOR="#ffc9c9">l<SUB>11</SUB></TD><TD>0</TD><TD>0</TD></TR> <TR><TD BGCOLOR="#ffc9c9">l<SUB>21</SUB></TD><TD BGCOLOR="#ffc9c9">l<SUB>22</SUB></TD><TD>0</TD></TR> <TR><TD BGCOLOR="#ffc9c9">l<SUB>31</SUB></TD><TD BGCOLOR="#ffc9c9">l<SUB>32</SUB></TD><TD BGCOLOR="#ffc9c9">l<SUB>33</SUB></TD></TR> </TABLE>>]; } }对角矩阵、上三角矩阵和下三角矩阵的 $3 \times 3$ 结构。彩色单元格表示可能非零的元素;“0”表示必须为零的元素。使用NumPy处理三角矩阵NumPy提供了函数来从现有矩阵中提取这些三角部分:np.triu() (上三角):返回矩阵的副本,其中主对角线下方元素置零。np.tril() (下三角):返回矩阵的副本,其中主对角线上方元素置零。# 使用之前的矩阵 A A = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ]) # 获取上三角部分(包括对角线) upper_A = np.triu(A) # 获取下三角部分(包括对角线) lower_A = np.tril(A) print("原始矩阵 A:\n", A) print("\n矩阵 A 的上三角部分:\n", upper_A) print("\n矩阵 A 的下三角部分:\n", lower_A)Output:Original matrix A: [[1 2 3] [4 5 6] [7 8 9]] Upper triangular part of A: [[1 2 3] [0 5 6] [0 0 9]] Lower triangular part of A: [[1 0 0] [4 5 0] [7 8 9]]np.triu() 和 np.tril() 都可以接受一个可选的第二个参数 k。如果 k=0(默认值),它使用主对角线。如果 k=1,它指的是主对角线上方的对角线;如果 k=-1,它指的是主对角线下方对角线,以此类推。这让您可以根据不同的对角线将元素置零。对角矩阵和三角矩阵可能看起来是特例,但它们在线性代数算法中经常出现,尤其是在求解线性方程组时以及将矩阵分解为更简单组成部分(矩阵分解)的技术中。辨认这些结构对于理解更高级的矩阵运算很有帮助。