创建一个2 x 2矩阵并找到它的逆

时间:2016-04-25 03:21:51

标签: python multidimensional-array matrix-inverse

class multiDimensionalArray:

def __init__(self, numRows, numColumns):
    self.R = numRows
    self.C = numColumns

    self.array = [[(x+3*y) for x in range(self.R)] for y in range(self.C)]        

    self.inverse = [[]]

def modifyItem(self, row, column, item):
    self.array[row][column] = item

def getItem(self, row, column):
    print self.array[row][column]
    return self.array[row][column]

def showArray(self):
    print self.array

def changeSize(self, rows, columns):
    self.R = rows
    self.C = columns
    self.array = [[(x+3*y) for x in range(self.R)] for y in range(self.C)]

def getSize(self):
    print [self.R, self.C]
    return [self.R, self.C]

def getInverse(self):

    if ((self.R == 2) and (self.C == 2)):
        a = self.array[0][0]
        b = self.array[0][1]
        c = self.array[1][0]
        d = self.array[1][1]

        for L in self.array:
            for item in L:
                item = int(item)

        self.inverse[0][0] = d
        self.inverse[0][1] = b * (-1)
        self.inverse[1][0] = c * (-1)
        self.inverse[1][1] = a

        self.inverse = self.inverse * (1 / (a*d - b*c))
        print self.inverse
        return self.inverse


mat = multiDimensionalArray(2,2)
mat.showArray()
mat.getInverse()

此代码卡在以下代码行中。错误说“列表分配索引超出范围”。我的目标是使其做到给定2x2矩阵的数学逆。 任何人都可以帮我搞定吗?感谢

self.inverse[0][0] = d
self.inverse[0][1] = b * (-1)
self.inverse[1][0] = c * (-1)
self.inverse[1][1] = a

1 个答案:

答案 0 :(得分:1)

有两个错误。

首先,将逆定义为self.inverse = [[]]。它没有元素[0][0],因此是一个例外。您可以改为编写self.inverse = [[0] * numColumns for i in range(numRows)]以使用零矩阵初始化逆。

程序将在self.inverse = self.inverse * (1 / (a*d - b*c))行失败:Python不知道如何将列表乘以数字。 一种方法可以是

k = 1 / (a*d - b*c)
self.inverse = [[x * k for x in u] for u in self.inverse]

另请注意,b * (-1)只能写成-b

除此之外,该类有点难看,但计算逆的答案是正确的。我说丑陋,因为通常矩阵类不会用预定义的常量矩阵初始化,而逆则是另一个矩阵,而不是成员。但我想只有测试才能准备出更好更完整的课程。

将self.inverse的元素相乘“就地”(即,不构建新矩阵):

for i in range(numRows):
    for j in range(numColumns):
        self.inverse[i][j] *= k

你也可以这样做:

for row in self.inverse:
    for j in range(numColumns):
        row[j] *= k