• 沒有找到結果。

第04讲 矩阵的基础知识

N/A
N/A
Protected

Academic year: 2021

Share "第04讲 矩阵的基础知识"

Copied!
9
0
0

加載中.... (立即查看全文)

全文

(1)

第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代码。

(2)

【结果分析】

在对矩阵的形态进行描述和分析的时候,通常使用矩阵的行数和列数进行描述。对应到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。

(3)

【定义】矩阵的转置:转置是矩阵的重要操作之一,矩阵的转置是以对角线为轴的镜像,这条对角线从 左上角到右下角被称为主对角线。我们将矩阵 的转置表示为 ,定义如下:

具体而言:

标量的转置:标量可以看成是只有一个元素的矩阵。因此,标量的转置等于它本身,即: 向量的转置:向量可以看作是只有一列(行)的矩阵。因此,向量的转置可以看作是只有一行

(列)的矩阵。

若将向量元素作为行向量写在文本行中,则可以通过转置将其转换为标准的列向量,比如:

若将向量直接写在文本行中,则向量 本身就是标准列向量,其转置 为行向量。

矩阵的转置也是一种运算,满足下述运算规律(假设运算都是可行的):

可以脱括号,但是要注意顺序

【定义】 给定矩阵 , 若将其行和列的元素进行位置互换,可以得到一个新的矩阵 。那么矩阵 就称为矩阵 的转置(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]]

(4)

【例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))

(5)

方阵 对称矩阵 零矩阵 对角矩阵 三角矩阵 单位矩阵

逆矩阵 正定矩阵 半正定矩阵 负定矩阵 正交矩阵  

【结果分析】

从结果可以看到,我们使用一个二维数组来显示向量(两层中括号),这种方法基本上贯穿于整个计算 机领域。其中 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)

(6)

矩阵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.]]

(7)

 

【结果分析】

值得注意的的是,在上面的代码中,我们一般使用(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)

(8)

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)

(9)

1. 如果矩阵 可逆,则 的逆矩阵唯一。

2. 若 为同阶可逆方阵,且满足 ,则 ,即 和 互逆 3. 若 可逆,则 也可逆,且 。

4. 若 可逆,数 ,则 可逆,且

5. 若 均为 阶可逆方阵,则 也可逆,且 。此性质可推广至 个同阶 方阵连乘的情况:

3.8 正交矩阵

正交矩阵:逆矩阵等于它的转置矩阵的方阵。正交矩阵的行向量和列向量分别都是标准正交,即该矩阵 的一个内积空间的正交基是元素两两正交的基,这意味着基向量的模长都是单位长度。

正交矩阵求逆矩阵的代价很小,因此备受关注,此外,它还具有很多有趣的性质,例如:

1.

2. 也是正交矩阵;

3. 的行列式值等于 或 ;

4. 的各行(列)是单位向量,且两两正交

3.9 正定矩阵、半正定矩阵和负定矩阵

正定矩阵(Positive Definite Matrix):对于矩阵 ,任意非零向量 ,都有:半正定矩阵(Positive Semidefinite Matrix):对于矩阵 ,任意非零向量 ,都有:负定矩阵(Negative Definite Matrix):对于矩阵 ,任意非零向量 ,都有: 。 对于以上三种特殊矩阵,它们都有很多不同的判定方法和性质,目前只需要记得它们的定义即可。

參考文獻

相關文件

 lower triangular matrix: 下三角矩陣.  upper triangular matrix:

The purpose of this research is to study a tiling problem: Given an m × n chessboard, how many ways are there to tile the chessboard with 1 × 2 dominoes and also ”diagonal”

若我們能知道有 k 個 row 的矩陣一 定能利用 elementary row operations 化為 echelon form 這個事實且利用這個事實證得有 k + 1 個 row 的矩陣一定能利用 elementary row

△ABC 為上底面、△DEF 為下底面,且上底面△ABC 與下底面△DEF 互相平行、△ABC △DEF;矩形 ADEB、矩形 BEFC 與 矩形 CFDA 皆為此三角柱的側面,且均同時與△ABC、△DEF

sort 函式可將一組資料排序成遞增 (ascending order) 或 遞減順序 (descending order)。. 如果這組資料是一個行或列向量,整組資料會進行排序。

比較項目 長條圖 直方圖 矩形之寬度 無任何意義

It is well known that second-order cone programming can be regarded as a special case of positive semidefinite programming by using the arrow matrix.. This paper further studies

正向成就 (positive accomplishment) 正向目標 (意義) (positive purpose) 正向健康 (positive health).. Flourish: A visionary new understanding of happiness