码农眼中的数学之~矩阵专栏(附Numpy讲解)
2.矩阵专栏¶
吐槽一下:矩阵本身不难,但是矩阵的写作太蛋疼了 (⊙﹏⊙)汗
还好有Numpy
,不然真的崩溃了...
LaTex
有没有一个集成了很多常用公式
以及推导
或者含题库
的在线编辑器?
代码裤子:https://github.com/lotapp/BaseCode
在线编程系:https://mybinder.org/v2/gh/lotapp/BaseCode/master
数学基础:https://www.cnblogs.com/dotnetcrazy/p/9294292.html
Numpy基础:https://www.cnblogs.com/dotnetcrazy/p/9309555.html
在线预览:http://github.lesschina.com/python/ai/math/矩阵专栏.html
2.1.矩阵的定义¶
矩阵:是一个按照长方阵列排列的复数或实数集合。
通俗讲就是:把数排成m行n列后,然后用中括号把它们括住,这种形式的组合就是矩阵了~ eg:
$\begin{bmatrix} &a_{11}&a_{12}&a_{13}&...&a_{1n} \\ &a_{21}&a_{22}&a_{23}&...&a_{2n} \\ &a_{31}&a_{32}&a_{33}&...&a_{3n} \\ &\vdots&\vdots&\vdots&\ddots&\vdots\\ &a_{m1}&a_{m2}&a_{m3}&...&a_{mn} \\ \end{bmatrix}$
比如上面这个示例就是一个m × n
的矩阵(m行n列的矩阵),如果m=n
那么就叫做n阶方阵
,eg:
$\begin{bmatrix} 1&2&3 \\ 4&5&6 \\ 7&8&9 \end{bmatrix}$
这个就是3阶
方阵
如果回到中学,老师肯定都是通过一次方程组来引入矩阵(逆天的老师是这么讲的):
$\begin{cases}x_1+x_2=-1\\2x_1-x_2=4\\3x_1+5x_2=-7\\\end{cases}$ ==> $\begin{bmatrix}1&1\\2&-1\\3&5\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix}=\begin{bmatrix}-1\\4\\-7\end{bmatrix}$
如果你方程组都忘记怎么解的话...好吧还是说下吧:“比如这题,可以先把x2移到右边,这样x1就等于一个表达式了(x1=-x2-1),然后带入第二个表达式就可以解出x1和x2了,一次的其实两个表达式就可以解出了,剩下的你可以把值带进去验证一下”
2.2.矩阵的运算(含幂运算)¶
2.2.1.加、减¶
加减比较简单,就是对应元素相加减 (只有行列都相同的矩阵
才可以进行)
就不用麻烦的LaTex
一行行打了,咱们用更方便的 NumPy 来演示一下矩阵加法(不懂代码的直接看结果,不影响阅读的)
Numpy有专门的矩阵函数(np.mat),用法和ndarray差不多
,我们这边使用经常使用ndarray
类型,基础忘记了可以去查看一下:Numpy基础
扩展:矩阵的加法运算满足交换律:A + B = B + A (乘法不行)
import numpy as np
# 创建两个集合
A = np.arange(1,10).reshape((3,3))
B = np.arange(9).reshape((3,3)) print(A)
print("-"*5)
print(B)
[[1 2 3]
[4 5 6]
[7 8 9]]
-----
[[0 1 2]
[3 4 5]
[6 7 8]]
# 加法
A + B
array([[ 1, 3, 5],
[ 7, 9, 11],
[13, 15, 17]])
# 和A+B相等
B + A
array([[ 1, 3, 5],
[ 7, 9, 11],
[13, 15, 17]])
# 减法
A - B
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
################ 变化来了 ################
# 之前说过 ”只有行列都相同的矩阵才可以进行“ 来验证一下
# 创建一个2行3列的矩阵
C = np.arange(6).reshape((2,3))
D = np.arange(6).reshape((3,2)) print(C)
print("-"*5)
print(D)
[[0 1 2]
[3 4 5]]
-----
[[0 1]
[2 3]
[4 5]]
# 2行3列的矩阵 + 3行2列的矩阵
C + D # 不同形状的矩阵不能进行加运算
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-8-bc97e29f7e31> in <module>()
1 # 2行3列的矩阵 + 3行2列的矩阵
----> 2C + D # 不同形状的矩阵不能进行加运算 ValueError: operands could not be broadcast together with shapes (2,3) (3,2)
C - D # 不同形状的矩阵不能进行减运算
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-9-ca5169d0bf6c> in <module>()
----> 1C - D # 不同形状的矩阵不能进行减运算 ValueError: operands could not be broadcast together with shapes (2,3) (3,2)
print(A)
[[1 2 3]
[4 5 6]
[7 8 9]]
# 比如2×A,A原本的每一个元素都扩大了两倍
2 * A
array([[ 2, 4, 6],
[ 8, 10, 12],
[14, 16, 18]])
print(A)
[[1 2 3]
[4 5 6]
[7 8 9]]
# 友情提醒:Numpy里面的运算基本上都是针对每一个元素
A / 2
array([[0.5, 1. , 1.5],
[2. , 2.5, 3. ],
[3.5, 4. , 4.5]])
2.2.3.矩阵乘法¶
矩阵乘法还是要用LaTex
演示一下的,不然有些朋友可能还是觉得比较抽象:(大家有什么好用的LaTex在线编辑器可以推荐的)
拿上面那个方程组来演示一下:
$\begin{bmatrix}1&1\\2&-1\\3&5\end{bmatrix}\begin{bmatrix}x_1\\x_2\end{bmatrix} ==> \begin{cases}x_1+x_2\\2x_1-x_2\\3x_1+5x_2\end{cases}$
稍微变化一下就更形象了:
$\begin{bmatrix}1&1\\2&-1\\3&5\end{bmatrix}\begin{bmatrix}x_1&y_1\\x_2&y_2\end{bmatrix} ==> \begin{cases}x_1+x_2\\2x_1-x_2\\3x_1+5x_2\end{cases} \begin{cases}y_1+y_2\\2y_1-x_2\\3y_1+5y_2\end{cases}==>\begin{bmatrix}x_1+x_2&y_1+y_2\\2x_1-x_2&2y_1-y_2\\3x_1+5x_2&3y_1+5y_2\end{bmatrix}$
举个简单的例子:A×B
$\begin{bmatrix} 1&2 \\3&4 \end{bmatrix}\begin{bmatrix} 4&3 \\2&1 \end{bmatrix}=\begin{bmatrix} 1*4+2*2&1*3+2*1 \\3*4+4*2&3*3+4*1 \end{bmatrix}=\begin{bmatrix} 8&5 \\20&13 \end{bmatrix}$
以后记不得怎么乘就自己推一下,值得注意的是:
两个矩阵的乘法仅当第一个矩阵A的列数(column)和另一个矩阵B的行数(row)相等才可以进行计算
你这样想就记得了:$\begin{bmatrix} 1&2 \\3&4 \end{bmatrix}\begin{bmatrix} x_1 \end{bmatrix} 还原成方程组就是这样\begin{cases}1*x_1+2*?\\3*x_1+4*?\end{cases}\\这是什么鬼?至少得这样吧:\begin{bmatrix} 1&2 \\3&4 \end{bmatrix}\begin{bmatrix} x_1 \\x_2 \end{bmatrix}$
# 通过代码看一看
A = np.array([[1,2],[3,4]])
B = np.array([[4,3],[2,1]]) print(A)
print("-"*5)
print(B)
[[1 2]
[3 4]]
-----
[[4 3]
[2 1]]
# 注意一下,Numpy里面的乘法默认是每个数对应相乘
# 如果是矩阵相乘可以使用dot()方法
# 或者你创建矩阵对象,这样×默认就是矩阵乘法了 A.dot(B) # 矩阵A×矩阵B
array([[ 8, 5],
[20, 13]])
程序验证了我们上面的运算结果,还得注意一下:
A×B
和B×A
是不一样的,eg:B×A
$\begin{bmatrix} 4&3 \\2&1 \end{bmatrix}\begin{bmatrix} 1&2 \\3&4 \end{bmatrix}=\begin{bmatrix} 4*1+3*3&4*2+3*4 \\2*1+1*3&2*2+1*4 \end{bmatrix}=\begin{bmatrix} 13&20 \\5&8 \end{bmatrix}$
如果你乘着乘着就忘记到底怎么乘,就把右边的矩阵换成x1,x2,然后就会了
print(A)
print("-"*5)
print(B)
[[1 2]
[3 4]]
-----
[[4 3]
[2 1]]
B.dot(A) # 矩阵B×矩阵A
array([[13, 20],
[ 5, 8]])
################ 变化来了 ################
# 来验证一下”两个矩阵的乘法仅当第一个矩阵A的列数(column)和另一个矩阵D的行数(row)相等才可以进行计算“
print(A)
print("-"*5)
print(D)
[[1 2]
[3 4]]
-----
[[0 1]
[2 3]
[4 5]]
# A有2列 D有3行
A.dot(D) # 不能乘
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-20-c1a9f22a6f8d> in <module>()
1 # A有2列 D有3行
----> 2A.dot(D) # 不能乘 ValueError: shapes (2,2) and (3,2) not aligned: 2 (dim 1) != 3 (dim 0)
# 你反过来就符合A的列数=D的行数了
D.dot(A)
array([[ 3, 4],
[11, 16],
[19, 28]])
print(A)
print("-"*5)
print(C)
[[1 2]
[3 4]]
-----
[[0 1 2]
[3 4 5]]
# 幂乘(每个元素开平方)
np.power(A,2) # 使用 A**2也一样
array([[ 1, 4],
[ 9, 16]])
# 幂乘(不一定是方阵)
np.power(C,2)
array([[ 0, 1, 4],
[ 9, 16, 25]])
################ 方阵幂运算 ################
# A*A*A
np.linalg.matrix_power(A,3)
array([[ 37, 54],
[ 81, 118]])
# 不是方阵就over
np.linalg.matrix_power(C,3)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-27-73f04ef7b54c> in <module>()
1 # 不是方阵就over
----> 2np.linalg.matrix_power(C,3) ~/anaconda3/lib/python3.6/site-packages/numpy/matrixlib/defmatrix.py in matrix_power(M, n)
137 M = asanyarray(M)
138 if M.ndim != 2 or M.shape[0] != M.shape[1]:
--> 139raise ValueError("input must be a square array")
140 if not issubdtype(type(n), N.integer):
141 raise TypeError("exponent must be an integer") ValueError: input must be a square array
来个小结 + 扩展:
矩阵的加法运算满足交换律:A + B = B + A
矩阵的乘法满足结合律和对矩阵加法的分配律:
结合律:(AB)C = A(BC)
左分配律:(A + B)C = AC + BC
右分配律:C(A + B) = CA + CB
矩阵的乘法与数乘运算之间也满足类似结合律的规律;与转置之间则满足倒置的
分配律:c(A + B) = cA + cB
结合律:c(AB) = (cA)B = A(cB)
矩阵乘法不满足交换律 一般来说,矩阵A及B的乘积AB存在,但BA不一定存在,即使存在,大多数时候AB ≠ BA
2.3.特殊矩阵¶
2.3.1.零矩阵¶
零矩阵就是所有的元素都是0
$ \begin{bmatrix} 0&0&0 \\ 0&0&0 \\ 0&0&0 \end{bmatrix} $
同样的:全1矩阵就是所有元素都是1
$ \begin{bmatrix} 1&1&1 \\ 1&1&1 \\ 1&1&1 \end{bmatrix} $
import numpy as np
# 一维
# 可以指定类型 np.zeros(5,dtype=int)
np.zeros(5) # 完整写法:np.zeros((5,))
array([0., 0., 0., 0., 0.])
# 二维
np.zeros((2,5))# 建议用元组,官方文档都是元组
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]])
# 三维 ==> 可以这么理解,2个2*5(2行5列)的矩阵
np.zeros((2,2,5))
array([[[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]], [[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.]]])
################ 全1矩阵 ################
# `np.ones(tuple)` 用法和`np.zeros(tuple)`差不多
# 可以指定类型 np.ones(5,dtype=int)
# 一维
np.ones(5) # 完整写法 np.ones((5,))
array([1., 1., 1., 1., 1.])
# 二维,传一个shape元组
np.ones((2,5))
array([[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]])
# 三维 可以理解为两个二维数组
np.ones((2,2,5))
array([[[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]], [[1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1.]]])
################ 指定值矩阵 ################
# 创建指定值的矩阵:
np.full((3,5),222)
array([[222, 222, 222, 222, 222],
[222, 222, 222, 222, 222],
[222, 222, 222, 222, 222]])
# 创建指定值的矩阵,浮点类型
np.full((3,5),222.0)
array([[222., 222., 222., 222., 222.],
[222., 222., 222., 222., 222.],
[222., 222., 222., 222., 222.]])
A = np.arange(6).reshape((2,3)) print(A)
[[0 1 2]
[3 4 5]]
# 转置矩阵(行列互换)
A.T
array([[0, 3],
[1, 4],
[2, 5]])
B = np.random.randint(10,size=(2,3)) print(B)
[[4 4 7]
[5 3 9]]
################ 验证系列 ################
# 验证一下(A+B)^T=A^T+B^T
print(A.T + B.T)
print("-"*5)
print((A+B).T)
[[ 4 8]
[ 5 7]
[ 9 14]]
-----
[[ 4 8]
[ 5 7]
[ 9 14]]
# 验证一下(A+B)^T=A^T+B^T
# 其实也再一次验证了,Numpy运算符默认是对每一个元素的操作
(A+B).T == A.T + B.T
array([[ True, True],
[ True, True],
[ True, True]])
################ 验证系列 ################
# 把A变成3*2的矩阵,不够元素用0补
# reshape:有返回值,不对原始多维数组进行修改
# resize:无返回值,会对原始多维数组进行修改
A.resize(3,2) print(A)
print(B)
[[0 1]
[2 3]
[4 5]]
[[4 4 7]
[5 3 9]]
# 验证(AB)^T=B^T×A^T
print((A.dot(B)).T)
print("-"*5)
print((B.T).dot(A.T))
[[ 5 23 41]
[ 3 17 31]
[ 9 41 73]]
-----
[[ 5 23 41]
[ 3 17 31]
[ 9 41 73]]
2.3.3.上三角矩阵和下三角矩阵¶
上三角矩阵 :主对角线以下都是零的方阵
$\begin{bmatrix} 2&9&4&7 \\ 0&7&3&3 \\ 0&0&6&1 \\ 0&0&0&1 \end{bmatrix}$
下三角矩阵 :主对角线以上都是零的方阵
$\begin{bmatrix} 2&0&0&0 \\ 3&7&0&0 \\ 5&6&7&0 \\ 1&2&3&4 \end{bmatrix}$
性质(行列式后面会说)
- 上(下)三角矩阵的行列式为对角线元素相乘
- 上(下)三角矩阵乘以系数后也是上(下)三角矩阵
- 上(下)三角矩阵间的加减法和乘法运算的结果仍是上(下)三角矩阵
- 上(下)三角矩阵的逆矩阵也仍然是上(下)三角矩阵
# 创建一个5行4列矩阵
A = np.random.randint(10,size=(4,4)) print(A)
[[3 5 2 3]
[7 2 9 6]
[5 1 7 6]
[1 2 8 4]]
# 上三角
np.triu(A)
array([[3, 5, 2, 3],
[0, 2, 9, 6],
[0, 0, 7, 6],
[0, 0, 0, 4]])
# 下三角
np.tril(A)
array([[3, 0, 0, 0],
[7, 2, 0, 0],
[5, 1, 7, 0],
[1, 2, 8, 4]])
# 验证一下最后一个性质
# 三角矩阵的逆矩阵也仍然是三角矩阵
print(np.triu(A).T)
print('-'*5)
print(np.tril(A).T)
[[3 0 0 0]
[5 2 0 0]
[2 9 7 0]
[3 6 6 4]]
-----
[[3 7 5 1]
[0 2 1 2]
[0 0 7 8]
[0 0 0 4]]
2.3.4.对角矩阵¶
对角矩阵 :主对角线之外的元素皆为0的方阵 (单位矩阵属于对角矩阵中的一种)
$\begin{bmatrix}0&0&0 \\0&0&0 \\0&0&0\end{bmatrix} \begin{bmatrix}1&0&0 \\0&1&0 \\0&0&1\end{bmatrix} \begin{bmatrix}2&0&0 \\0&2&0 \\0&0&2\end{bmatrix} \begin{bmatrix}3&0&0 \\0&9&0 \\0&0&6\end{bmatrix}$
扩充:对角矩阵的运算包括和、差运算、数乘运算、同阶对角阵的乘积运算,且结果仍为对角阵
而且有意思的是:对角矩阵的矩阵幂运算等于其对应元素的幂运算
$\begin{bmatrix}3&0&0 \\0&9&0 \\0&0&6\end{bmatrix}^n = \begin{bmatrix}3^n&0&0 \\0&9^n&0 \\0&0&6^n\end{bmatrix}$
# 简单创建
np.diag([3,9,6])
array([[3, 0, 0],
[0, 9, 0],
[0, 0, 6]])
np.diag([2,2,2])
array([[2, 0, 0],
[0, 2, 0],
[0, 0, 2]])
################ 验证系列 ################
# np.diag?
print(A) # 获取对角元素,然后再生成对角矩阵
B = np.diag(A.diagonal()) #或者 np.diag(np.diag(A)) print(B)
[[3 5 2 3]
[7 2 9 6]
[5 1 7 6]
[1 2 8 4]]
[[3 0 0 0]
[0 2 0 0]
[0 0 7 0]
[0 0 0 4]]
B.dot(B).dot(B)
array([[ 27, 0, 0, 0],
[ 0, 8, 0, 0],
[ 0, 0, 343, 0],
[ 0, 0, 0, 64]])
# 对角矩阵的矩阵幂运算等于其对应元素的幂运算
B**3
array([[ 27, 0, 0, 0],
[ 0, 8, 0, 0],
[ 0, 0, 343, 0],
[ 0, 0, 0, 64]])
# 定义一个2行的单位矩阵(列默认和行一致)
# np.eye(rows,columns=rows)
np.eye(2)
array([[1., 0.],
[0., 1.]])
################ 验证扩展 ################
# 可以指定类型
B = np.eye(4,dtype=int) print(B)
[[1 0 0 0]
[0 1 0 0]
[0 0 1 0]
[0 0 0 1]]
print(A)
[[3 5 2 3]
[7 2 9 6]
[5 1 7 6]
[1 2 8 4]]
# 任何矩阵 x 单位矩阵 都等于其本身
A.dot(B)
array([[3, 5, 2, 3],
[7, 2, 9, 6],
[5, 1, 7, 6],
[1, 2, 8, 4]])
# 反过来也一样(这个和1*a=a*1一个道理)
B.dot(A)
array([[3, 5, 2, 3],
[7, 2, 9, 6],
[5, 1, 7, 6],
[1, 2, 8, 4]])
A = np.random.randint(10,size=(4,4)) print(A)
[[0 1 6 9]
[1 2 4 7]
[4 8 7 9]
[3 6 8 0]]
B = np.triu(A)
B += B.T - np.diag(A.diagonal())
print(B)
[[0 1 6 9]
[1 2 4 7]
[6 4 7 9]
[9 7 9 0]]
# 验证一下
B.T == B
array([[ True, True, True, True],
[ True, True, True, True],
[ True, True, True, True],
[ True, True, True, True]])
################ 分步解释 ################
# 创建上三角矩阵
B = np.triu(A) print(B)
[[0 1 6 9]
[0 2 4 7]
[0 0 7 9]
[0 0 0 0]]
# 上三角+它的逆矩阵(发现距离对角矩阵只是多加一次对角线上的元素)
B += B.T print(B)
[[ 0 1 6 9]
[ 1 4 4 7]
[ 6 4 14 9]
[ 9 7 9 0]]
# 所以减去对角线上的元素,得到对角矩阵
B - np.diag(A.diagonal())
array([[0, 1, 6, 9],
[1, 2, 4, 7],
[6, 4, 7, 9],
[9, 7, 9, 0]])
2.4.逆矩阵¶
逆矩阵 :设A是数域上的一个n阶方阵,若在相同数域上存在另一个n阶矩阵B,使得:AB=BA=E
则我们称B是A的逆矩阵(表示为$A^{-1}$),而A则被称为可逆矩阵
通俗话讲就是:原矩阵×逆矩阵=逆矩阵×原矩阵=单位矩阵
2.4.1.消元法¶
可能一看到逆矩阵,大家就想到代数余子式 ,不过逆天要说的是,代数余子式就和我们程序员面试题一样,有些题目就是又繁琐实际运用又没多大意义的题目一样,很多时候面试官都不看面试题一眼,同样的那些出题老师自己解题一般都不会使用。我这边介绍一下方便简单的方法“消元法”
比如求$\begin{bmatrix}3&2 \\1&2\end{bmatrix}^{-1}$,就可以表示为:
$\begin{bmatrix}3&2 \\1&2\end{bmatrix}\begin{bmatrix}x_{11}&x_{12} \\x_{21}&x_{22}\end{bmatrix}=\begin{bmatrix}1&0 \\0&1\end{bmatrix}$
转换成方程组:
$\begin{cases} \begin{bmatrix}3&2 \\1&2\end{bmatrix}\begin{bmatrix}x_{11} \\x_{21}\end{bmatrix}=\begin{bmatrix}1 \\0\end{bmatrix}\\ \begin{bmatrix}3&2 \\1&2\end{bmatrix}\begin{bmatrix}x_{12} \\x_{22}\end{bmatrix}=\begin{bmatrix}0 \\1\end{bmatrix} \end{cases} ==> 求方程组\begin{cases}3x_{11}+2x_{21}=1\\1x_{11}+2x_{21}=0\end{cases}和\begin{cases}3x_{12}+2x_{22}=0\\1x_{12}+2x_{22}=1\end{cases}的解$
这样很轻松就能解出逆矩阵了
$\begin{cases}x_{11}=\frac{1}{2}\\x_{21}=-\frac{1}{4} \end{cases}\\\begin{cases}x_{12}=-\frac{1}{2}\\x_{22}=\frac{3}{4} \end{cases}\\ ==> \begin{bmatrix}\frac{1}{2}&-\frac{1}{2} \\-\frac{1}{4}&\frac{3}{4} \end{bmatrix}$
A = np.array([[3,2],[1,2]]) print(A)
[[3 2]
[1 2]]
# 求A的逆矩阵
np.linalg.inv(A)
array([[ 0.5 , -0.5 ],
[-0.25, 0.75]])
2.4.2.二阶方阵公式¶
如果只是2阶方阵,有更简单的公式(只能2阶使用,而消元法不受限制)矩阵是否可逆就看分母是否为0
$\large{\begin{bmatrix}a_{11}&a_{12} \\a_{21}&a_{22}\end{bmatrix}=\frac{1}{a_{11}a_{22}-a_{12}a_{21}}\begin{bmatrix}a_{22}&-a_{12} \\-a_{21}&a_{11}\end{bmatrix}}$
比如求$\begin{bmatrix}3&2 \\1&2\end{bmatrix}^{-1}$:
$\frac{1}{3×2-2×1}\begin{bmatrix}2&-2 \\-1&3\end{bmatrix}=\begin{bmatrix}\frac{1}{2}&-\frac{1}{2} \\-\frac{1}{4}&\frac{3}{4} \end{bmatrix}$
扩展系列:伪逆矩阵¶
非方阵可以求 伪逆矩阵 AXA=A,XAX=X
判断矩阵是否可逆:
$$det\begin{bmatrix}a_{11}&a_{12} \\a_{21}&a_{22}\end{bmatrix}=a_{11}a_{12}-a_{12}a_{21}\\det\begin{bmatrix}a_{11}&a_{12}&a_{13} \\a_{21}&a_{22}&a_{23}\\a_{31}&a_{32}&a_{33}\end{bmatrix}=a_{11}a_{22}a_{33}+a_{12}a_{23}a_{31}+a_{13}a_{21}a_{32}-a_{13}a_{22}a_{31}-a_{12}a_{21}a_{33}-a_{11}a_{23}a_{32}$$
方法很多(比如还可以通过余子式),公式其实有规律,你可以先摸索下(给个提示):
项 | 正负 |
---|---|
a11a22 | + |
a12a21 | - |
项 | 正负 |
---|---|
a11a22a33 | + |
a11a23a32 | - |
a12a21a33 | - |
a12a23a31 | + |
a13a21a32 | + |
a13a22a31 | - |
程序比较简单:np.linalg.det(A)
A = np.array([[7, 3, 6],[5, 3, 1]]) print(A)
[[7 3 6]
[5 3 1]]
# 不等于0就是可逆
np.linalg.det(A)
---------------------------------------------------------------------------
LinAlgError Traceback (most recent call last)
<ipython-input-47-2ce8e7bdf499> in <module>()
1 # 不等于0就是可逆
----> 2np.linalg.det(A) ~/anaconda3/lib/python3.6/site-packages/numpy/linalg/linalg.py in det(a)
1869 a = asarray(a)
1870 _assertRankAtLeast2(a)
-> 1871_assertNdSquareness(a)
1872 t, result_t = _commonType(a)
1873 signature = 'D->D' if isComplexType(t) else 'd->d' ~/anaconda3/lib/python3.6/site-packages/numpy/linalg/linalg.py in _assertNdSquareness(*arrays)
209 for a in arrays:
210 if max(a.shape[-2:]) != min(a.shape[-2:]):
--> 211raise LinAlgError('Last 2 dimensions of the array must be square')
212
213 def _assertFinite(*arrays): LinAlgError: Last 2 dimensions of the array must be square
# 必须是方阵的验证
np.linalg.inv(A)
---------------------------------------------------------------------------
LinAlgError Traceback (most recent call last)
<ipython-input-48-0af3c81a492f> in <module>()
1 # 必须是方阵的验证
----> 2np.linalg.inv(A) ~/anaconda3/lib/python3.6/site-packages/numpy/linalg/linalg.py in inv(a)
521 a, wrap = _makearray(a)
522 _assertRankAtLeast2(a)
--> 523_assertNdSquareness(a)
524 t, result_t = _commonType(a)
525 ~/anaconda3/lib/python3.6/site-packages/numpy/linalg/linalg.py in _assertNdSquareness(*arrays)
209 for a in arrays:
210 if max(a.shape[-2:]) != min(a.shape[-2:]):
--> 211raise LinAlgError('Last 2 dimensions of the array must be square')
212
213 def _assertFinite(*arrays): LinAlgError: Last 2 dimensions of the array must be square
# 有时候还是需要求逆矩阵
# 那就可以求它的伪逆矩阵
X = np.linalg.pinv(A) print(X)
[[-0.00632911 0.15189873]
[-0.05696203 0.16708861]
[ 0.20253165 -0.26075949]]
# A*X*A=A
A.dot(X).dot(A)
array([[7., 3., 6.],
[5., 3., 1.]])
# X*A*X=X
X.dot(A).dot(X)
array([[-0.00632911, 0.15189873],
[-0.05696203, 0.16708861],
[ 0.20253165, -0.26075949]])
################ 简单说下mat ################
# 创建一个矩阵
A = np.mat([[3,2],[1,2]]) print(A)
type(A)
[[3 2]
[1 2]]
numpy.matrixlib.defmatrix.matrix
# 求它的逆矩阵
A.I
matrix([[ 0.5 , -0.5 ],
[-0.25, 0.75]])
# A^T
A.T
matrix([[3, 1],
[2, 2]])
# *默认就是矩阵乘法
A * A
matrix([[11, 10],
[ 5, 6]])
# 更多自己查看下帮助文档把,用法和array基本上一样,
# 我这边只是简单提一下,怕你们不去看(所有和矩阵相关的东西,里面都有封装,很方便)
np.mat?
码农眼中的数学之~矩阵专栏(附Numpy讲解)的更多相关文章
- 经典算法C++版(参考一线码农博文)
鉴于一线码农的算法博文基本通过C#完成,此处用C++再实现一遍,具体解法可参考其博文. 地址:http://www.cnblogs.com/huangxincheng/category/401959. ...
- 老码农冒死揭开行业黑幕:如何编写无法维护的代码[ZZ]
下面是一篇有意思的"代码大全",可谓 逆软件工程. 老码农冒死揭开行业黑幕:如何编写无法维护的代码 原文如下 让自己稳拿铁饭碗 ;-) – Roedy Green(翻译版略有删节) ...
- 码农"混子"的思想转变
首先介绍一下自己,在高中的时候学校对于我们这种普通班级采取的都是放养状态,所以高中的学习真是不咋地,可能除了自己擅长的数学以外其他也就考个三四十分,后来磕磕绊绊的在打游戏之余也会学习,第一次参加高考跟 ...
- 码农,就要做有范儿的geek【网摘】
摘要: “我是个geek,圈子里都称呼我为xx,我周一到周五亲自写写代码,指导指导新人,周末参加圈子的活动,跟别人分享一下我的经验.至于未来嘛,还没想过,反正自己技术水平在这了,呵呵,扎克伯格当年不也 ...
- YoloV4当中的Mosaic数据增强方法(附代码详细讲解)码农的后花园
上一期中讲解了图像分类和目标检测中的数据增强的区别和联系,这期讲解数据增强的进阶版- yolov4中的Mosaic数据增强方法以及CutMix. 前言 Yolov4的mosaic数据增强参考了CutM ...
- 【整理】待毕业.Net码农就业求职储备
声明:本文题目来源于互联网,仅供即将从学校毕业的.Net码农(当然,我本人也是菜逼一个)学习之用.当然,学习了这些题目不一定会拿到offer,但是针对就业求职做些针对性的准备也是不错的.此外,除了技术 ...
- <开心一笑> 码农 黑客和2B程序员之间的区别
笔记本电脑 码农: 黑客: 2B程序员: 求2的32次方: 码农: System.out.println(Math.pow(2, 32)); 黑客: System.out.println(1L< ...
- [2013 eoe移动开发者大会]靳岩:从码农到极客的升级之路
(国内知名Android开发论坛 eoe开发者社区推荐:http://www.eoeandroid.com/) 前天,2013 eoe 移动开发者大会在国家会议中心召开,eoe 开发者社区创始人靳岩在 ...
- 专门为码农定制的14款创意的T裇(T-Shirt)设计
T裇衫是人们在各种场合都可穿着的服装,如在T裇衫上作适当的装饰,即可增添无穷的韵味.通过图案直接反映人类的精神风貌,你可以把日常生活中的兴趣.习惯.喜怒哀乐.嗜好等展露无疑,张扬个性.秀出自我.对于码 ...
随机推荐
- react组件选项卡demo
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Azure系列2.1.9 —— CloudBlob
(小弟自学Azure,文中有不正确之处,请路过各位大神指正.) 网上azure的资料较少,尤其是API,全是英文的,中文资料更是少之又少.这次由于公司项目需要使用Azure,所以对Azure的一些学习 ...
- CentOs7安装docker(第二篇)
一.Docker的概念: Docker: 镜像:Images 类似于面向对象中的类 容器:Container 类似于面向对象中的对象 它们之间的关系:容器Container通过镜像Images来创建 ...
- idea 方便的设置代码段
使用快捷键(ctrl+alt+s)找到:从idea的菜单File->Settings->Editor->Live Templates 先添加Template Group,然后添加Li ...
- 设计模式笔记:开闭原则(OCP,The Open-Closed Principle)
1. 开闭原则概述 开闭原则(OCP,The Open-Closed Principle)两个主要特征: (1)对扩展开放(open for extension):模块的行为的可以扩展的,当应用的需求 ...
- python数据结构与算法第十一天【希尔排序】
1.希尔排序的原理 2.代码实现 def shell_sort(alist): n = len(alist) # 初始步长 gap = n / 2 while gap > 0: # 按步长进行插 ...
- 【转】console.log 用法
标签: 转自http://www.cnblogs.com/ctriphire/p/4116207.html 大家都有用过各种类型的浏览器,每种浏览器都有自己的特色,本人拙见,在我用过的浏览器当中,我是 ...
- DFI LP DK P45 T2RS PLUS BIOS SETTING
standard cmos features date (mm:dd:yy) mon,oct 11 2016 time (hh:mm:ss) 10 : 10 : 26 ide channel 0 sa ...
- Windows & RabbitMQ:Shovel
RabbitMQ的集群和高可用不适合跨域的情况,如果跨域可以使用Shovel或Federation. 描述:我们需要配置三台服务器:ServerA, ServerB, ServerC Step 1:安 ...
- 搭建Hexo博客(三)—换电脑继续写Hexo博客
Hexo和GitHub搭建博客的原理是:Hexo将source下的md文件生成静态的html页面,存放到public目录中,这一步是由命令:hexo -g完成.接下来执行hexo -d命令,就将pub ...