【问题标题】:python inverse matrix without numpy没有numpy的python逆矩阵
【发布时间】:2020-06-26 14:23:00
【问题描述】:

我无法弄清楚我的代码有什么问题,这非常令人沮丧。 我必须制作逆矩阵函数,我认为我已经完成了。我不知道为什么它不起作用。问题可能与星星有关,经过这一步我的矩阵名为 mat 更改为单位矩阵,但为什么呢?在加星之前,它会正常打印我赋予功能的垫子矩阵,但在加星之后,它是一个单位矩阵,我不明白为什么会发生这种情况。这是我所拥有的:

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 

【问题讨论】:

  • 提供一些示例输入并显示您遇到了什么错误
  • 请将此减少并增强为预期的MRE。显示中间结果与预期结果的偏差。另外,请学习格式化和标记您的输出;你把你的操作隐藏在不可读的print 命令中。
  • 这将仅用于 2x2 矩阵或更大的矩阵吗?您是否需要此代码来处理任何和所有维度,或者您是否知道您将获得的矩阵的维度?
  • 它也适用于更高的维度。用户必须先指定昏暗和输入矩阵,这是较大程序的一部分。
  • 你确定矩阵有逆矩阵吗?如果没有,您可能希望将其添加到 identity_matrix_conertion() 的顶部:if len(m) == 0: return None if len(m[0]) != len(m): return None

标签: python matrix-inverse


【解决方案1】:

不要在identity_matrix_convertion()函数中说x = m[:],你应该添加以下sn-p:

x = []
for i in m:
    arr = [a for a in i]
    x.append(arr)

x = m[:] 仍在引用 m 而不仅仅是复制。

【讨论】:

  • 哦。如果我想制作一个新副本,那么 x = m[:] 是一种正确的方法。谢谢
  • 我们在这里必须准确。 x = m[:] 不引用 m,但它只创建一个浅拷贝。试试a = [1,2,3]b = a[:]a[1] = 4 然后print b 会打印出[1,2,3]。导致问题的原因是副本的浅层,因此列表中的元素是引用,因为我们将 2D 矩阵作为列表列表处理。 docs.python.org/3/library/copy.html
【解决方案2】:

跟进@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]

甚至更好:我们可以使用内置的copy 模块(随处可用):

import copy
x = copy.deepcopy(m)

另见:Copying nested lists in Python

【讨论】:

    猜你喜欢
    • 2015-11-13
    • 1970-01-01
    • 2014-03-05
    • 2012-05-12
    • 2019-01-27
    • 1970-01-01
    • 2010-09-17
    • 1970-01-01
    • 2014-03-17
    相关资源
    最近更新 更多