我尝试对矩阵2x2和矩阵3x3进行此操作,但是我想使用诸如 for 或 while 的循环。
from libmatrice import det2, det3, comatrice, transposee, inverse
reponse = input('Quelle est la dimension de la matrice à inverser (2 ou 3) ?\n')
determinant = 0
if reponse == '2':
print('''Votre matrice est de dimension 2 (2 lignes et 2 colonnes)''')
A11 = int(input('''Quel est votre premier chiffre ?\n'''))
A12 = int(input('''Quel est votre deuxième chiffre ?\n'''))
A21 = int(input('''Quel est votre troisième chiffre ?\n'''))
A22 = int(input('''Quel est votre quatrième chiffre ?\n'''))
determinant = det2(A11, A12, A21, A22)
print('''Le déterminant de votre matrice 2x2 est : ''', determinant)
elif reponse == '3':
print('''Votre matrice est de dimension 3 (3 lignes et 3 colonnes)''')
A11 = int(input('''Quel est votre premier chiffre ?\n'''))
A12 = int(input('''Quel est votre deuxième chiffre ?\n'''))
A13 = int(input('''Quel est votre troisème chiffre ?\n'''))
A21 = int(input('''Quel est votre quatrième chiffre ?\n'''))
A22 = int(input('''Quel est votre cinquième chiffre ?\n'''))
A23 = int(input('''Quel est votre sixième chiffre ?\n'''))
A31 = int(input('''Quel est votre septième chiffre ?\n'''))
A32 = int(input('''Quel est votre huitième chiffre ?\n'''))
A33 = int(input('''Quel est votre neuvième chiffre ?\n'''))
determinant = det3(A11, A12, A13, A21, A22, A23, A31, A32, A33)
打印(行列式)
comatrice = comatrice(A11, A12, A13, A21, A22, A23, A31, A32, A33)
print('''Votre comatrice est : ''', comatrice)
detA11 = comatrice[0]
detA12 = comatrice[1]
detA13 = comatrice[2]
detA21 = comatrice[3]
detA22 = comatrice[4]
detA23 = comatrice[5]
detA31 = comatrice[6]
detA32 = comatrice[7]
detA33 = comatrice[8]
transpose = transposee(detA11, detA21, detA31, detA12, detA22, detA32,detA13, detA23, detA33)
TA11 = transpose[0]
TA12 = transpose[1]
TA13 = transpose[2]
TA21 = transpose[3]
TA22 = transpose[4]
TA23 = transpose[5]
TA31 = transpose[6]
TA32 = transpose[7]
TA33 = transpose[8]
print('''La matrice inverse est : ''', inverse(determinant, TA11, TA21, TA31, TA12, TA22, TA32, TA13, TA23, TA33))
else:
pass
我也使用一个库,但是因为我不使用循环,所以不需要def reduit(matrix)
def det2(A11, A12, A21, A22):
diagonale_1 = A11*A22
diagonale_2 = A12*A21
resultat = diagonale_1 - diagonale_2
return resultat
def det3(A11, A12, A13, A21, A22, A23, A31, A32, A33):
#pour A11:
diagonale_A11_1 = A22 * A33
diagonale_A11_2 = A32 * A23
resultat_A11 = diagonale_A11_1 - diagonale_A11_2
#pour A12:
diagonale_A12_1 = A21 * A33
diagonale_A12_2 = A31 * A23
resultat_A12 = diagonale_A12_1 - diagonale_A12_2
#pour A13:
diagonale_A13_1 = A21 * A32
diagonale_A13_2 = A31 * A22
resultat_A13 = diagonale_A13_1 - diagonale_A13_2
#resultat final:
resultat_final = A11 * resultat_A11 - A12 * resultat_A12 + A13 * resultat_A13
return resultat_final
def reduit(matrice):
pass
def comatrice(A11, A12, A13, A21, A22, A23, A31, A32, A33):
detA11 = A22 * A33 - A32 * A23
detA12 = -(A21 * A33 - A31 * A23)
detA13 = A21 * A32 - A31 * A22
detA21 = -(A12 * A33 - A32 * A13)
detA22 = A11 * A33 - A31 * A13
detA23 = -(A11 * A32 - A31 * A12)
detA31 = A12 * A23 - A22 * A13
detA32 = -(A11 * A23 - A21 * A13)
detA33 = A11 * A22 - A21 * A12
return detA11, detA12, detA13, detA21, detA22, detA23, detA31, detA32, detA33
def transposee(detA11, detA12, detA13, detA21, detA22, detA23, detA31, detA32, detA33):
TA11 = detA11
TA21 = detA12
TA31 = detA13
TA12 = detA21
TA22 = detA22
TA32 = detA23
TA13 = detA31
TA23 = detA32
TA33 = detA33
return TA11, TA21, TA31, TA12, TA22, TA32, TA13, TA23, TA33
def inverse(det, TA11, TA12, TA13, TA21, TA22, TA23, TA31, TA32, TA33):
invTA11 = TA11 // det
invTA21 = TA21 // det
invTA31 = TA31 // det
invTA12 = TA12 // det
invTA22 = TA22 // det
invTA32 = TA32 // det
invTA13 = TA13 // det
invTA23 = TA23 // det
invTA33 = TA33 // det
return invTA11, invTA12, invTA13, invTA21, invTA22, invTA23, invTA31, invTA32, invTA33
您是否有任何想法要使我的代码更“干净”,以便在第二个代码中集成一些循环? 第一个代码块称为matrice。pywitch是python中的程序询问其尺寸是2x2还是3x3的接口。
libmatrice是从libmatrice.py导入的
答案 0 :(得分:0)
您可以使用for
循环,将矩阵表示为列表(列表):
A = [[1, 2], [3, 4]]
def det2(A):
return A[0][0]*A[1][1] - A[0][1]*A[1][0]
def inv2(A):
d = det2(A)
return [[A[1][1]/d, -A[0][1]/d], [-A[1][0]/d, A[0][0]/d]]
print(det2(A)) # 2
print(inv2(A)) # [[-2.0, 1.0], [1.5, -0.5]]
一个3维尺寸:
B = [[1, 21, 3], [3, 4, 5], [5, 6, 9]]
def det3(B):
ret = 0
for i in range(3):
pos = 1
neg = 1
for j in range(3):
pos *= B[j][(i+j) % 3]
neg *= B[j][(i-j) % 3]
ret += (pos - neg)
return ret
def inv3(B):
ret = [3*[None] for _i in range(3)]
det = det3(B)
for i in range(3):
for j in range(3):
adj = [[n for ii, n in enumerate(row) if ii != i]
for jj, row in enumerate(B) if jj != j]
d = det2(adj)
sgn = (-1)**(i+j)
ret[i][j] = sgn * d / det
return ret
print(det3(B)) # -42
print(inv3(B))
# [[-0.14285714285714285, 4.071428571428571, -2.2142857142857144],
# [0.047619047619047616, 0.14285714285714285, -0.09523809523809523],
# [0.047619047619047616, -2.357142857142857, 1.4047619047619047]]
请注意,二维的行列式几乎是微不足道的;对于3维,我使用了rule of sarrus。
这可能会让您开始如何做一般情况。