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
答案 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