原理:應用列主元消去法運算矩陣a的逆矩陣,利用初等矩陣行變換a轉化單位矩陣時,同樣的行變化可將單位矩陣轉化為a的逆矩陣。
步驟:編制下三角部分消元和上三角部分消元的**
a. 從對角線元素往下比較取得這一列的最大值所在的行,與對角線元素所在行進行交換。
b. 從對角線所在行往下,利用矩陣的行變換將這一列下所有元素消為0,儲存消元過程中的係數(三角矩陣)
c. 類似b步驟從最後一列往前消元消成對角矩陣,同樣儲存消元過程中的係數
d. 從第一列開始依次進行a,b,c步驟
對角單位化(用一元陣列儲存)
矩陣每一行除對角線元素,將矩陣化為單位矩陣。
生成乙個與矩陣a同階的單位矩陣,對單位矩陣進行上述過程相同的行變化(取上述變換生成的主元交換和消元引數矩陣),即可以得到矩陣a的逆
# -*- coding: utf-8 -*-
"""@author: machinerandy
"""import warnings
warnings.filterwarnings("ignore")
matrix1 = [
[1,2,0,0],
[3,4,0,0],
[0,0,4,1],
[0,0,3,2],
]matrix2 = [
[1,0,-1,2,1],
[3,2,-3,5,-3],
[2,2,1,4,-2],
[0,4,3,3,1],
[1,0,8,-11,4],
]matrix3 = [
[1,0,-1,2,1,0,2],
[1,2,-1,3,1,-1,4],
[2,2,1,6,2,1,6],
[-1,4,1,4,0,0,0],
[4,0,-1,21,9,9,9],
[2,4,4,12,5,6,11],
[7,-1,-4,22,7,8,18],
]def
step0
(m):
n = len(m)
l =
for i in range(0,n):
for j in range(0,n):
if i == j:
else:
return l
defstep1
(m):
n = len(m)
"""交換操作記錄陣列 swap"""
swap =
l =
for i in range(0,n):
for j in range(0,n):
"""對每一列進行操作"""
for i in range(0,n):
max_row = m[i][i]
row = i
for j in range(i,n):
if m[j][i] >= max_row:
max_row = m[j][i]
global row
row = j
swap[i] = row
"""交換"""
if row != i:
for j in range(0,n):
m[i][j],m[row][j] = m[row][j],m[i][j]
"""消元"""
for j in range(i+1,n):
if m[j][i] != 0:
l[j][i] = m[j][i] / m[i][i]
for k in range(0,n):
m[j][k] = m[j][k] - (l[j][i] * m[i][k])
return (swap,m,l)
defstep2
(m):
n = len(m)
long = len(m)-1
l =
for i in range(0,n):
for j in range(0,n):
for i in range(0,n-1):
for j in range(0,long-i):
if m[long-i-j-1][long-i] != 0
and m[long-i][long-i] != 0:
l[long-i-j-1][long-i] = m[long-i-j-1][long-i] / m[long-i][long-i]
for k in range(0,n):
m[long-i-j-1][k] = m[long-i-j-1][k] - l[long-i-j-1][long-i] * m[long-i][k]
return (m,l)
defstep3
(m):
n = len(m)
l =
for i in range(0,n):
return l
defgauss
(matrix):
n = len(matrix)
new = step0(matrix)
(swap,matrix1,l1) = step1(matrix)
(matrix2,l2) = step2(matrix1)
l3 = step3(matrix2)
for i in range(0,n):
if swap[i] != i:
new[i],new[swap[i]] = new[swap[i]],new[i]
for j in range(i+1,n):
for k in range(0,n):
if l1[j][i] != 0:
new[j][k] = new[j][k] - l1[j][i] * new[i][k]
for i in range(0,n-1):
for j in range(0,n-i-1):
if l2[n-1-i-j-1][n-1-i] != 0:
for k in range(0,n):
new[n-1-i-j-1][k] = new[n-1-i-j-1][k] - l2[n-1-i-j-1][n-i-1] * new[n-1-i][k]
for i in range(0,n):
for j in range(0,n):
new[i][j] = new[i][j] / l3[i]
return new
x1 = gauss(matrix1)
x2 = gauss(matrix2)
x3 = gauss(matrix3)
python矩陣運算,轉置,逆運算,共軛矩陣例項
我就廢話不多說了,大家還是直接看 吧!先定義兩個矩陣 x np.array 1,2104,5,1,45 1,1416,3,2,40 1,1534,3,2,30 1,852,2,1,36 y np.array 45,40,30,36 內積以後發現 www.cppcns.comc np.dot x.t,...
矩陣運算的python實現
前言 一上學好多亂七八糟的事,志願活動呀,社會實踐呀,參加也後悔,不參加也後悔,有了更好的朋友就可以踩著原來的朋友向上嗎?空 之前矩陣覺得這個挺好的,那麼就看看如何進行直接計算吧,這樣的話,要是有題的話我就有矩陣計算器了呢。矩陣加法相比大家都知道的,就那樣,話不多說,來吧老鐵 矩陣相加 a 1 3,...
矩陣運算及 快速冪求矩陣
矩陣運算 這裡主要是針對方陣 是很重要的乙個環節,先說加法吧 加法比較簡單,同行同列想加就可以運算的 mat operator mat a,mat b 其次就是乘法 原理也簡單 線性代數應該學過,a i k 和 b k j 和做乘積運算得到c i j mat operator mat a,mat b...