numpy矩陣相關和線性代數linalg模組

2021-08-10 02:32:10 字數 3425 閱讀 5118

單位矩陣e:單位矩陣/8540268

矩陣求逆:

矩陣計算:

# numpy.linalg模組包含線性代數的函式。使用這個模組,可以計算逆矩陣、求特徵值、解線性方程組以及求解行列式等。

import numpy as np

# 1. 計算逆矩陣

# 建立矩陣

a = np.mat("0 1 2;1 0 3;4 -3 8")

print (a)

#[[ 0 1 2]

# [ 1 0 3]

# [ 4 -3 8]]

# 使用inv函式計算逆矩陣

inv = np.linalg.inv(a)

print (inv)

#[[-4.5 7. -1.5]

# [-2. 4. -1. ]

# [ 1.5 -2. 0.5]]

# 檢查原矩陣和求得的逆矩陣相乘的結果為單位矩陣

print (a * inv)

#[[ 1. 0. 0.]

# [ 0. 1. 0.]

# [ 0. 0. 1.]]

# 注:矩陣必須是方陣且可逆,否則會丟擲linalgerror異常。

# 2. 求解線性方程組

# numpy.linalg中的函式solve可以求解形如 ax = b 的線性方程組,其中 a 為矩陣,b 為一維或二維的陣列,x 是未知變數

import numpy as np

#建立矩陣和陣列

b = np.mat("1 -2 1;0 2 -8;-4 5 9")

b = np.array([0,8,-9])

# 呼叫solve函式求解線性方程

x = np.linalg.solve(b,b)

print (x)

#[ 29. 16. 3.]

# 使用dot函式檢查求得的解是否正確

print (np.dot(b , x))

# [[ 0. 8. -9.]]

# 3. 特徵值和特徵向量

# 特徵值(eigenvalue)即方程 ax = ax 的根,是乙個標量。其中,a 是乙個二維矩陣,x 是乙個一維向量。特徵向量(eigenvector)是關於特徵值的向量

# numpy.linalg模組中,eigvals函式可以計算矩陣的特徵值,而eig函式可以返回乙個包含特徵值和對應的特徵向量的元組 

import numpy as np

# 建立乙個矩陣

c = np.mat("3 -2;1 0")

# 呼叫eigvals函式求解特徵值

c0 = np.linalg.eigvals(c)

print (c0)

# [ 2. 1.]

# 使用eig函式求解特徵值和特徵向量 (該函式將返回乙個元組,按列排放著特徵值和對應的特徵向量,其中第一列為特徵值,第二列為特徵向量)

c1,c2 = np.linalg.eig(c)

print (c1)

# [ 2. 1.] 

print (c2)

#[[ 0.89442719 0.70710678]

# [ 0.4472136 0.70710678]] 

# 使用dot函式驗證求得的解是否正確

for i in range(len(c1)):

print ("left:",np.dot(c,c2[:,i]))

print ("right:",c1[i] * c2[:,i])

#left: [[ 1.78885438]

# [ 0.89442719]]

#right: [[ 1.78885438]

# [ 0.89442719]]

#left: [[ 0.70710678]

# [ 0.70710678]]

#right: [[ 0.70710678]

# [ 0.70710678]]

# 4.奇異值分解

# svd(singular value decomposition,奇異值分解)是一種因子分解運算,將乙個矩陣分解為3個矩陣的乘積

# numpy.linalg模組中的svd函式可以對矩陣進行奇異值分解。該函式返回3個矩陣——u、sigma和v,其中u和v是正交矩陣,sigma包含輸入矩陣的奇異值。

import numpy as np

# 分解矩陣

d = np.mat("4 11 14;8 7 -2")

# 使用svd函式分解矩陣

u,sigma,v = np.linalg.svd(d,full_matrices=false)

print ("u:",u)

#u: [[-0.9486833 -0.31622777]

# [-0.31622777 0.9486833 ]]

print ("sigma:",sigma)

#sigma: [ 18.97366596 9.48683298]

print ("v",v)

#v [[-0.33333333 -0.66666667 -0.66666667]

# [ 0.66666667 0.33333333 -0.66666667]]

# 結果包含等式中左右兩端的兩個正交矩陣u和v,以及中間的奇異值矩陣sigma

# 使用diag函式生成完整的奇異值矩陣。將分解出的3個矩陣相乘

print (u * np.diag(sigma) * v)

#[[ 4. 11. 14.]

# [ 8. 7. -2.]]

# 5. 廣義逆矩陣

# 使用numpy.linalg模組中的pinv函式進行求解,

# 注:inv函式只接受方陣作為輸入矩陣,而pinv函式則沒有這個限制

import numpy as np

# 建立乙個矩陣

e = np.mat("4 11 14;8 7 -2")

# 使用pinv函式計算廣義逆矩陣

pseudoinv = np.linalg.pinv(e)

print (pseudoinv)

#[[-0.00555556 0.07222222]

# [ 0.02222222 0.04444444]

# [ 0.05555556 -0.05555556]]

# 將原矩陣和得到的廣義逆矩陣相乘

print (e * pseudoinv)

#[[ 1.00000000e+00 -5.55111512e-16]

# [ 0.00000000e+00 1.00000000e+00]]

# 6. 行列式

# numpy.linalg模組中的det函式可以計算矩陣的行列式

import numpy as np

# 計算矩陣的行列式

f = np.mat("3 4;5 6")

# 使用det函式計算行列式

print (np.linalg.det(f))

# -2.0

Numpy(3) 線性代數相關函式

numpy.linalg 中有一組標準的矩陣分解運算以及諸如求逆和行列式之類的東西 np.linalg.diag 以一維陣列的形式返回方陣的對角線 或非對角線 元素,或將一維陣列轉換為方陣 非對角線元素為0 矩陣b的第二維大小,必須等於矩陣c的第一維大小 d b.dot c 等價於 np.dot b...

矩陣 Matrices 線性代數

矩陣 在數學中,矩陣 matrix 是乙個按照長方陣列排列的複數或實數集合 矩陣相加 通常的矩陣加法被定義在兩個相同大小的矩陣 矩陣乘法 矩陣和向量的乘法 如圖 m n 的矩陣乘以 n 1 的向量,得到的是 m 1 的向量 矩陣乘法 m n 矩陣乘以 n o 矩陣,變成 m o 矩陣。矩陣乘法的性質...

線性代數 矩陣相乘

線性代數 矩陣相乘1 矩陣相乘 2 include 3using namespace std 45 6int main 7 矩陣c 結果矩陣 13 cout 請輸入矩陣a的行數和列數 14 cin am an 15 cout 請輸入矩陣b的行數和列數 16 cin bm bn 17if an bm ...