Python 3 - IndexError:在尝试查找矩阵的行列式

时间:2016-08-02 07:14:37

标签: python python-3.x math matrix

我试图找到一个表示二维矩阵的嵌套列表的行列式。但它无限调用getMinor()函数并不断从同一列表中删除,这不应该发生,因为我每次都在创建新列表。下面是代码。此外,所有函数都在名为' Matrix()'。

的类中定义
def __init__(self):
    self.matrix_list = []
    self.no_of_row = 0
    self.no_of_col = 0

def getMinor(self, matrix, j):
    del matrix[0]
    for i in range(len(matrix)):
        del matrix[i][j]

    m = Matrix()
    m.matrix_list = matrix[:]
    m.no_of_row = len(m.matrix_list)
    #print(m.no_of_row)
    print(m.matrix_list)
    m.no_of_col = len(m.matrix_list[0])
    return m.detMatrix()

def detMatrix(self):
    if self.no_of_row == 2 and self.no_of_col == 2:
        return self.matrix_list[0][0] * self.matrix_list[1][1] - self.matrix_list[0][1] * self.matrix_list[1][0]
    else:
        matrix = self.matrix_list[:]
        det = 0
        for i in range(self.no_of_col):
            det += ((-1)**i) * self.matrix_list[0][i] * self.getMinor(matrix, i)
        return det

1 个答案:

答案 0 :(得分:1)

你有两个问题。一个是由user2357112提到的,遗憾的是他没有费心去解释。当您使用表达式x [:]时,您将获得列表x的浅表副本。深拷贝和浅拷贝通常没有实际区别;例如,如果x包含数字或字符串。但在你的情况下,x的元素是列表。新列表的每个元素x [:]将与原始x中的子列表相同 - 而不是副本。当您删除这些嵌套列表中的一个元素(del matrix [i] [j])时,您将删除一些原始数据。

第二个问题是你没有正确处理递归。您可以在函数detMatrix中创建一个新变量matrix。即使您在此处进行深层复制,也无法解决问题。您将矩阵传递给getMinor,它会从中删除一些数据。现在,在你的for循环的下一步中,你搞砸了数据。您需要在函数getMinor中内部进行深层复制。

这是一个至少运行的程序。我没检查你的代数: - )

我还要补充一点,效率很低。制作副本然后从副本中删除片段的想法没有多大意义。我没有解决这个问题。

import copy
class Matrix:
    def __init__(self):
        self.matrix_list = []
        self.no_of_row = 0
        self.no_of_col = 0

    def getMinor(self, matrix_list, j):
        print("Entry:", matrix_list)
        matrix = copy.deepcopy(matrix_list)
        del matrix[0]
        for i in range(len(matrix)):
            del matrix[i][j]
        print("After deletions", matrix_list)

        m = Matrix()
        m.matrix_list = matrix[:]
        m.no_of_row = len(m.matrix_list)
        m.no_of_col = len(m.matrix_list[0])
        x = m.detMatrix()
        print(m.matrix_list, m.no_of_row, m.no_of_col)
        return x

    def detMatrix(self):
        if self.no_of_row == 2 and self.no_of_col == 2:
            return self.matrix_list[0][0] * self.matrix_list[1][1] - self.matrix_list[0][1] * self.matrix_list[1][0]
        else:
            det = 0
            for i in range(self.no_of_col):
                det += ((-1)**i) * self.matrix_list[0][i] * self.getMinor(self.matrix_list, i)
            return det

m = Matrix()
m.matrix_list.append([0.0,1.0,2.0,3.0])
m.matrix_list.append([1.0,2.0,3.0,4.0])
m.matrix_list.append([2.0,3.0,4.0,5.0])
m.matrix_list.append([3.0,5.0,7.0,9.0])
m.no_of_row = 4
m.no_of_col = 4

print(m.detMatrix())