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
最佳答案
有两个错误。
首先,将逆定义为 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
。
除此之外,这个类有点难看,但计算出的逆答案是正确的。我说丑陋,是因为通常矩阵类不会使用预定义的常量矩阵进行初始化,并且逆矩阵将是另一个矩阵,而不是成员。但我想只有测试才能准备更好、更完整的类(class)。
<小时/>“就地”乘以 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
关于python - 创建 2 x 2 矩阵并求其逆矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36831521/