python 没有numpy的逆矩阵
python inverse matrix without numpy
我无法弄清楚我的代码有什么问题,这真令人沮丧。
我必须制作逆矩阵函数,我认为我已经完成了。我不知道为什么它不起作用。问题可能是与stars一致,在这一步之后我的名为mat的矩阵被更改为identity matrix,但是为什么呢?在 stars 之前,它打印我的 mat matrix normaly,我赋予它功能,但在 stars 之后,它是一个单位矩阵,我不明白为什么会这样。这是我拥有的:
def identity_matrix_convertion(m):
x = m[:]
for i in range(len(x)):
for j in range(len(x[0])):
if i == j:
x[i][j] = 1
else:
x[i][j] = 0
return x
def inverse_matrix(mat):
n = len(mat)
am = mat[:]
show_matrix(mat)
**i = identity_matrix_convertion(am)**
show_matrix(mat)
im = i[:]
ind = list(range(n))
print(len(mat))
if determinant(mat) == 0:
print("This matrix doesn't have an inverse.")
if len(mat) == len(mat[0]):
for i in range(n):
scal = 1.0 / am[i][i]
for j in range(n):
am[i][j] *= scal
im[i][j] *= scal
for k in ind[0:i] + ind[i + 1:]:
current_scal = am[k][i]
for l in range(n):
am[k][l] = am[k][l] - current_scal * am[i][j]
im[k][l] = im[k][l] - current_scal * im[i][j]
return im
so after line **i = identity_matrix_convertion(am)** my mat matrix is changed into identity matrix, but why?
The result is:
1.0 2.0 3.0
2.0 1.0 3.0
4.0 3.0 2.0
The result is:
1 0 0
0 1 0
0 0 1
不要在 identity_matrix_convertion()
函数中说 x = m[:]
,您应该添加以下代码段:
x = []
for i in m:
arr = [a for a in i]
x.append(arr)
x = m[:]
仍在引用 m,而不仅仅是复制。
根据@NumberC 的回答,x = m[:]
确实制作了一份副本,但只是一份浅表副本。复制的列表将包含对其他列表的内部列表的引用,因此在 x
中操作这些列表也会导致 m
中的更改。这是因为我们将二维矩阵表示为列表的列表。如果有人重新排序 m
中的列表(因此不是列表中的项目,而是 m
中列表的纯顺序),顺序将在 x
副本中保持不变。但是,列表 列表中的任何更改 也会改变另一个。我希望这不会造成混淆,List changes unexpectedly after assignment. Why is this and how can I prevent it? 有一些数字。
因为我们不必吓跑 [:]
我们仍然可以说:
x = new_list = [y[:] for y in m]
甚至更好:我们可以使用 built-in copy
模块(随处可用):
import copy
x = copy.deepcopy(m)
另请参阅:Copying nested lists in Python
我无法弄清楚我的代码有什么问题,这真令人沮丧。 我必须制作逆矩阵函数,我认为我已经完成了。我不知道为什么它不起作用。问题可能是与stars一致,在这一步之后我的名为mat的矩阵被更改为identity matrix,但是为什么呢?在 stars 之前,它打印我的 mat matrix normaly,我赋予它功能,但在 stars 之后,它是一个单位矩阵,我不明白为什么会这样。这是我拥有的:
def identity_matrix_convertion(m):
x = m[:]
for i in range(len(x)):
for j in range(len(x[0])):
if i == j:
x[i][j] = 1
else:
x[i][j] = 0
return x
def inverse_matrix(mat):
n = len(mat)
am = mat[:]
show_matrix(mat)
**i = identity_matrix_convertion(am)**
show_matrix(mat)
im = i[:]
ind = list(range(n))
print(len(mat))
if determinant(mat) == 0:
print("This matrix doesn't have an inverse.")
if len(mat) == len(mat[0]):
for i in range(n):
scal = 1.0 / am[i][i]
for j in range(n):
am[i][j] *= scal
im[i][j] *= scal
for k in ind[0:i] + ind[i + 1:]:
current_scal = am[k][i]
for l in range(n):
am[k][l] = am[k][l] - current_scal * am[i][j]
im[k][l] = im[k][l] - current_scal * im[i][j]
return im
so after line **i = identity_matrix_convertion(am)** my mat matrix is changed into identity matrix, but why?
The result is:
1.0 2.0 3.0
2.0 1.0 3.0
4.0 3.0 2.0
The result is:
1 0 0
0 1 0
0 0 1
不要在 identity_matrix_convertion()
函数中说 x = m[:]
,您应该添加以下代码段:
x = []
for i in m:
arr = [a for a in i]
x.append(arr)
x = m[:]
仍在引用 m,而不仅仅是复制。
根据@NumberC 的回答,x = m[:]
确实制作了一份副本,但只是一份浅表副本。复制的列表将包含对其他列表的内部列表的引用,因此在 x
中操作这些列表也会导致 m
中的更改。这是因为我们将二维矩阵表示为列表的列表。如果有人重新排序 m
中的列表(因此不是列表中的项目,而是 m
中列表的纯顺序),顺序将在 x
副本中保持不变。但是,列表 列表中的任何更改 也会改变另一个。我希望这不会造成混淆,List changes unexpectedly after assignment. Why is this and how can I prevent it? 有一些数字。
因为我们不必吓跑 [:]
我们仍然可以说:
x = new_list = [y[:] for y in m]
甚至更好:我们可以使用 built-in copy
模块(随处可用):
import copy
x = copy.deepcopy(m)
另请参阅:Copying nested lists in Python